参考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生的每个小序列都有一个初始值,即随机种子(即根据某一个初始值代入某个公式产生一系列值),注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后,它们又会重复出现。
我们知道rand()函数可以用来产生随机数,但这不是真正意义上的随机数,而是一个伪随机数,是根据一个数(我们称之为种子)为基准以某个递推公式算出来的一系列数,当这系列数很大时,就符合正态分布,从而相当于产生了随机数,但这不是真正意义上的数,当计算机正常开机后,这个种子的值是定了的,所以随机数也是定了的,除非你破坏了系统。
-
rand()
功能:随机数产生器; 用法:int rand(void); 头文件:stdlib.h
rand()的内部实现是用线性同余法,它不是真的随机数,因其周期特别长,故在一定范围内可以看成是随机的。
rand()返回一随机数值的范围在0~RAND_MAX之间。RAND_MAX的范围最少是在32676之间(int),unsigned int则为65535。0~RAND_MAX中每个数字·被选中的几率是相同的。
当用户未设定随机数种子时,系统默认的随机数种子为1。因此rand()产生的是伪随机数字,每次执行是相同的“?此处有问题,不理解(每次执行的含义是什么)?”,通过运行程序验证发现,每一次执行程序会产生一系列随机数,但每一次运行产生的这一系列随机数是相同的;若要不同,应该用srand()来初始化。 -
srand()
功能:初始化随机数发生器 用法:void srand(unsigned int seed) 头文件:stdlib.h
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是一个整数。如果每次seed都设为相同值,rand()所产生的随机数值每次就会一样。若想使每次运行的的参数seed不一样,我们可以使用当前时钟作为种子,因为每次运行时间肯定不一样。
- 2.1. 使用当前时钟作为随机数种子
使用当前时钟,我们可以使用头文件ctime或time.h里面的time()函数
- 产生随机数的方法
- a. 给srand()提供一个种子,它是一个unsigned int类型;
- b. 调用rand(),它会根据提供给srand()的种子值返回一个随机数;
- c. 根据需要多次调用rand(),从而不间断地得到新的随机数
- d. 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果
- 测试代码
#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
// srand((int)time(NULL));
for(int i=0;i<10;i++)
cout<<rand()<<' ';
cout<<endl;
// for(int i=0;i<10;i++)
// cout<<random(1,100)<<' ';
return 0;
}
结果:没有用srand()初始化每次运行都是下面那一系列数
srand()初始化
#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
srand((int)time(NULL));
for(int i=0;i<10;i++)
cout<<rand()<<' ';
cout<<endl;
// for(int i=0;i<10;i++)
// cout<<random(1,100)<<' ';
return 0;
}
结果:每次运行产生的一系列数都不同
- 产生一定范围内的随机数
- a. [a,b): (rand()%(b-a))+a //取随机数对(b-a)取余(最大为b-a-1),再加上a,,即[a,b)
- b. [a,b]: (rand()%(b-a+1))+a;
- c. (a,b]: (rand()%(b-a))+a+1;
- d. (a,b): (rand()%(b-a-1))+a+1;
- d. 通用公式: a+rand()%n ,其中a是起始值,n是范围,注意对n取余最大值为n-1
- e. 要取得0~1之间的浮点数,可以使用rand()/(double)RAND_MAX
#include<iostream>
#include<cstdlib>
#include<ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
srand((int)time(NULL));
for(int i=0;i<10;i++)
cout<<rand()<<' ';
cout<<endl;
for(int i=0;i<10;i++)
cout<<random(1,100)<<' ';
return 0;
}
结果:
以上