生成随机数
生成随机数的方法是运用time()、srand()和rand()来配合生成。
time()
在<time.h>中
原型: time_t time(time_t *seconds)
作用: 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。
rand()
<stdlib.h>
原型: int rand(void)
作用: 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。
rand()是根据一个种子值来产生生随机数的。随机数的产生也和rand()的调用次数有关。
一开始的种子值是电脑开机时就产生的一个数值,下次开机这个数值会变动。如果不改变种子的值,那么电脑在不重启的条件下,每次用rand()产生的数值都是相同的。所以要改变种子值。
srand()
<stdlib.h>
原型: void srand(unsigned int seed)
作用: 播种由函数 rand 使用的随机数发生器。
先用srand(time(NULL))来对随机数发生器进行初始化。也就是重新播种。这样每次运行程序时,种子值是不同的。这样再调用rand()便可生成随机数。
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
int x;
srand(time(NULL));
x = rand();
cout << "x="<<x<<"\n";
return 0;
}
输出
第一次:
第二次:
可以通过取余来达到生成某一范围内的随机数。
如果要连续生成随机数,那么要注意。因为播种是通过time()作为参数来进行的,这与程序运行时的时间有关。如果播种在循环里面。
列如:
int main()
{
int x;
for (int i = 0; i < 10; i++) {
srand(time(NULL));
x = rand();
cout << "x=" << x << "\n";
}
return 0;
}
输出:
发现生成的数都是一样的。因为循环执行的很快,所以用time()返回的值差距非常小,几乎一样。所以每次循环播的种子值是相同的。要连续输出随机数的话有两种比较简单的改法。
1.使rand()的调用次数发生变化。
上面的例子中srand()会重置rand()的调用次数。所以,rand()都是首次调用。而随机数的产生又与rand的调用次数有关。便可知道把srand()放到循环外面就可以实现想要的效果。
int main()
{
int x;
srand(time(NULL));
for (int i = 0; i < 10; i++) {
x = rand();
cout << "x=" << x << "\n";
}
return 0;
}
输出:
2.改变种子的值
把srand()里的参数改成time()+rand()
这样就可以使得每次参数的值都不同。
int main()
{
int x;
for (int i = 0; i < 10; i++) {
srand(time(NULL) + rand());
x = rand();
cout << "x=" << x << "\n";
}
return 0;
}
输出:
其实这种方法生成的随机数都是伪随机数。因为和当时的时间和rand()的调用次数有关。只要数值能够确定,就可以通过计算得到生成的随机数。所以,这并不是绝对的随机数。
文章可能存在一些问题,请大家多多包涵。我也只是一名学生,这只是分享我之前学过的一些知识。