三种方法生成随机数之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岁生日。写的很青涩。如有错漏请各位不吝赐教。