三种方法生成随机数之srand篇
srand()函数:随机数发生器的初始化函数,需要提供一个种子,这个种子会对应一个随机数。如果使用相同的种子,rand() 函数会出现一样的随机数。默认种子数是1,即srand(1)。
srand()
<stdlib.h>
原型: void srand(unsigned int seed)
作用: 播种由函数 rand 使用的随机数发生器。
函数说明:
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed.如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
rand()
<stdlib.h>
原型: int rand(void)
作用: 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。
函数说明 :
rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用 unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1。rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int x;
srand(time(0));
x = rand();
cout<<"x="<<x<<"\n";
return 0;
}

因为我们定义的种子seed是关于时间的函数time(),所以得到的结果是随时间变化的
若我们默认种子为1,则
int x;
srand(1);
x = rand();
cout<<"x="<<x<<"\n";
return 0;


结果是一样的。根本原因就在于生成的不是真正意义的随机数,而是伪随机数
srand函数的本质就是设置产生随机数的公式的参数(随机数种子),如果使用相同的种子,那么得到的随机数也就是相同的。自然,如果使用不同的种子,得出的随机数序列也是不同的。
如果我们将srand函数写进for循环之中呢?
int main()
{
int x;
for(int i=0;i<10;i++)
{
srand(time(0));
x = rand();
cout<<"x="<<x<<"\n";
}
return 0;
}

我们可以发现生成的数都是一样的。因为循环执行的很快,所以用time()返回的值差距非常小,几乎一样。所以每次循环播的种子值是相同的。要连续输出随机数的话有两种比较简单的改法。
方法一:把函数写在循环之外
int main()
{
int x;
srand(time(0));
for(int i=0;i<10;i++)
{
x = rand();
cout<<"x="<<x<<"\n";
}
return 0;
}

方法二:改变seed的值
把srand中的参数改成time()+rand(),这样就可以让每一次调用的参数不一样
int x;
for(int i=0;i<10;i++)
{
srand(time(0)+rand());
x = rand();
cout<<"x="<<x<<"\n";
}
return 0;

结果不一样的原因:因为rand()每次返回的值是固定的,是一定的随机数列,故合也为不一样的,这取决于rand();而再运行一次发现结果依旧不一样的原因则取决于srand(time())
这是博主第一篇博客,献给21岁生日。写的很青涩。如有错漏请各位不吝赐教。