在c++中使用stdlib.h 中的rand()函数输出伪随机数数列。
srand(unsigned int):给rand函数一个种子,使其初始化。一般用srand((unsigned int)time(NULL));,使用当前时间来初始化。
rand();随机数生成函数,可以输出随机数列,在一个种子下共有65535个,则之后会重复出现。位于stdlib.h中。rand_max为0x7fff,但输出时最大值为32765
实现随机数的方法有两种,一种通过一个确定性算法实现的伪随机数生成,一种是选取真实世界的自然随机源来生成的真随机数。
真随机数要需要特别的系统函数或者硬件电路来换取真随机源的信息,如 计算机网络中IP包到达的时间,随机噪音,计算机当前的秒级时钟,键盘反应的时间,热噪声,操作系统的进程信息,光量子的偏振等。真随机数效率较低,一般在程序使用伪随机发生器产生的伪随机数。
常用的伪随机生成方法为线性同余法:
随机数序列{Xn} 由以下式子迭代得到:
Xn+1 = ( a * Xn + c ) mod m , n>= 0
X0为种子,且 0 =< X0 <m ;
常数m为模数,m >0 。
常数a为乘子, 0=<a<m。
参数c为增量, 0=<c<m
一个好的线性同余法的取值使其能产生高质量的随机数。要使其满周期,即使其周期数等于为m。一般选择m=2^l,l为使用数据类型的比特数,如使用int时,为32,这样会使周期很大,且整数溢出,不用进行模操作。然后要使其满周期,则a = 4A +1,b = 2B + 1 , A,B为任意的正整数。X0一般取当前时钟值。