截止今天20点前,我一共完成了两个C++的实验,我觉得对于编程,有个最重要的原则,就是要多练习光学不
练是不会有进步的。以今天为例,本来觉得这两个实验应该是非常困难的,但是上手之后,遇到问题就解决问
题,没有拖延及时解决,提升编程能力,使我现在的感觉超级好,所以学习语言一定要多加练习才能有所收获,
才能有成就感。
随机数问题
C++中没有自带的random函数,要实现随机数的生成需要用到rand()
和srand()
函数。
Rand()
单纯的rand()
会返回一个0至RAND_MAX之间的随机数,而RAND_MAX的值与int的位数有关,最小是32767。
不过rand()
是一次性的,因为系统默认的随机数种子为1,只要随机数种子不变,其生成的随机数数列就
不会变。
##Srand()srand()
可用来设置rand()
产生随机数时的随机数种子。通过设置不同的种子,我们可以获取不同的随机
数序列。可以利用srand((unsigned int)(time(NULL))
的方法,利用系统时钟,产生不同的随机数种子。
不过要调用time()
,需要加入头文件< ctime >
。
1 | #include<iostream> |
通式
产生一定范围随机数的通用表示公式是:
- 取得(0,x)的随机整数:rand()%x;
- 取得(a,b)的随机整数:rand()%(b-a);
- 取得[a,b)的随机整数:rand()%(b-a)+a;
- 取得[a,b]的随机整数:rand()%(b-a+1)+a;
- 取得(a,b]的随机整数:rand()%(b-a)+a+1;
- 取得0-1之间的浮点数:rand()/double(RAND_MAX)。
编程过程中遇到的问题
我编写的程序中需要生成两个随机数,开始时我的代码是(我这是一个类中的两个函数)1
2
3
4
5
6
7
8
9
10
11
12int Dice::playdice1()
{
srand((unsigned)time(NULL));
dicenum= rand() % 6 + 1;
return dicenum;
}
int Dice::playdice2()
{
srand((unsigned)time(NULL));
dicenum = rand() % 6 + 1;
return dicenum;
}
但是这样的方式产生了一个问题,就是运行的结果是两个函数返回的结果值总是一样的,为了解决这个问题,
通过Baidu知道,只用将第二个函数中的srand((unsigned)time(NULL));
去掉即可。原因是因为time
函数是以毫秒为单位返回时间的,而目前的CPU是很快的,在这个程序里两次time的调用间隔肯定是小于1毫
秒的,所以导致srand产生的种子一样。
一个线程里,srand用一次就行了,而不是每次rand都要srand。