最早的随机数生成与计算机的先驱冯诺依曼联系到一起的。 随机数可以分为两种,一种为真随机数,一种为伪随机数。
真随机数的生成过程是完全不可预测的,因此要生成一个真随机数,计算机需要检测外部发生的某种物理现象。比如说,可以测量某个原子的放射性衰变。根据量子理论,原子衰变是随机而不可测的,所以这就是宇宙中的“纯粹”随机性。
计算机生成真随机就依赖于硬件设备。更具体一点的例子就是计算机可以根据当前CPU的频率以及温度等来生成随机数,或者根据环境中的噪音或者采取你敲击键盘的精确时间作为随机数据,这种随机数的生成方式被称为硬件随机数生成器。
而伪随机数则是运行程序产生的随机数。计算机通过发送种子数值,运用算法产生某个看起来像随机数的数字。但是实际上这个数字是可以预测的。因为计算机没有从环境中收集到任何随机信息。
常用的伪随机数生成器有线性同余方法(LCG)。它是根据递归公式:
其中A、B、M都是生成器设定的常数,mod为对M取余数。
给定种子数字X0即可由此产生线性同余的随机数列。往往为了方便,X0取计算机的系统时间。因此对于线性同余的伪随机数生成器,给定同一个初始值,那么产生的伪随机数列也是相同的。由此生成的随机数范围为0到M-1。
因此在对随机性要求不高的情况下,往往只需要生成伪随机数即可,比如游戏中的抽奖,那么用的是真随机数或伪随机数并不重要;但是如果你的应用正在加密,情况就不同了,因为你不希望攻击者能够猜到你的随机数。
计算机怎样产生随机数?函数rand(),每次运行都会产生随机数。
原理:利用物理不稳电路,电路会根据当前周边电磁场信号,随机产生无线电接收信号,然后转换成数字,因为电场的不稳定性,所以每次产生的数字都会不同,绝对不可能连续生成一样的数字;
简单使用:A、慨然软件的工具或开发环境中使用这个函数;B、Excel表格中,在各自中使用这个函数,每次都能产生不同的数字;
常规使用场合:A、随机数抽奖程序;B、大数据测试;C、游戏中的骰子产生随机数。