随机数与随机种子

一.种子数

种子数:计算机所产生的随机数是通过一串很长的序列数模拟随机数,故称为伪随机数,在实际应用这些随机数时,这些随机数一般都能具有真实随机数的所有概率性质和统计性质,因此可以产生许许多多的序列伪随机数,一个序列的第一个随机数对应一个数,这个数称为种子数(seed)。

种子数是属于统计学,由计算机按一定程序产生。

二.随机数

随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模拟法计算的时候等等。 产生随机数有多种不同的方法。这些方法被称为随机数发生器。随机数最重要的特性是:它所产生的后面的那个数与前面的那个数毫无关系。

1.根据密码学原理,随机数的随机性检验可以分为三个标准

(1)统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。

(2)密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。

(3)真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。

2.随机数的分类

(1)伪随机数:满足第一个条件的随机数。

(2)密码学安全的伪随机数:同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出。

(3)真随机数:同时满足三个条件的随机数。

3.随机数的产生原理

通常有两种方法

(1)平方取中法

1>从一个n位数x开始,称为种子

2>将它平方得到一个2n位数(必要时前面加0)

3>取中间的n位数做为下一个随机数

这种方法有一个缺点就是产生的随机数会趋向0

(2)线性同余法

选择三个整数a,b,c,给定初始种子X(0)

按下列规则生成数列

X(n+1)=( a * X(n) + b )mod(c)

这种方式产生的随机数会出现循环

但是只要我们把c取得足够大就可以保证不会在我们运算中出现循环

很多计算机都是利用这个原理产生随机数的

只是c值取得很大,c=2^31 ​

三.随机数与随机种子

随机数就是就随机数种子中取出的数。种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。

但这个随技术并不真正随机。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列。

也就是说种子和随机数列是一一对应的。{An}=f(x), x 就是种子,F()是算法,{An}是数列,这个数列看上去是随机的,这是因为An的通项很复杂。

例如: 从1、2、3、4、5、6、7、8、9、0这十个数中随机取出一个数,取出的数是6的话,那么6就叫随机数。十个数字就叫随机数种子。 如果是从1到50之间取数字,取出的数字叫随机数,这1到50那50个数字就叫随机数种子。

其实很多东西都可以拿来当作随机数种子,比如PID、TID、TIME、CPU时钟周期数、鼠标指针XY坐标、已用内存字节数、电源的3.3V、5V和12V电压、CPU风扇转速……

随便拿几个出来,做个MD5、SHA-256之类的Hash,都可以当作随机数种子(甚至如果只需要一个随机数的话,咋个Hash本身就可以当随机数了)

四.c++中如何生成随机数

1.rand:随机生成(返回)0~RAND_MAX之间的某一个数。RAND_MAX=32767。

    注:rand模板为 int x=rand()%n+m。表示生成的随机数在区间【n,n-m+1】中。 

2.srand:是随机数发生器的初始化函数,括号内为种子值。例:srand(time(NULL))。time(NULL) 是计算1970年1月1日00:00:00到现在为止经过多少秒。

全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务