主题:计算机如何生成真正的随机数表? -- 马前卒
有3个问题
1 能通过软件实现吗?
2 如果不能,目前有硬件来做这个事情吗?
3 是否一定要量子化硬件实现真正的随机数?
没办法,太忙。
1) 软件实现的方法多数是有一个随机数表,由用户决定从哪一个数目开始逐个往下用,周而复始。如果不是由用户决定的话,也可以由时钟来决定从哪个数目开始。
2) 听说过有硬件产生的随机数,原理是量度底板电流噪音,由于极小的温度变化,也会引起噪音的变化,好象是证明过,足够随机。
3) 不清楚。
记得读大学时有这一门专业课,嫌不实用,没修。
随机数在许多领域都有重要应用,比较重要的是:密码学和网络安全。密钥的安全性很大程度上依赖于随机数的质量。
计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。像懒厨所说的,时间作为随机数序列的种子的方法,能够构建一个平均分布(起码是“比较平均”)的数列。但是,如果你知道了那个“种子”和算法,实际上,也就无“随机性”可言了。
通常在关乎安全的重要领域,都采用硬件随机数发生器。一般称之为:真随机数产生模块(RNG)。其原理也比较简单,采集物理噪声源,比如说板级噪声、背景噪声等等,作为随机数发生器的依据。
如果你感兴趣的话,可以参考一些硬件密码组件,或者安全芯片之类的硬件手册,里边都有较详细的说明。
It talks like a duck, walks like a duck, it is a duck. 虽说是“伪”的,只要在统计意义上满足要求,就足够用了。
具体算法可以查统计教科书。对通用的几个伪随机数产生方法而言,即使我们预先知道这就是个伪随机数,但是不知道伪随机数产生器的内部状态,还是很难完全复制出伪随机数序列的。至于这是不是密码学意义里的不可破解,我得查书才能回答。
物理方法产生的随机数是够随机,但是缺点是不可控。你说我抛硬币是50-50的概率,但实际总有各种因素造成真正分布是类似49。99999-50。00001的概率。而另一方面,所谓真正的分布又只有靠大量实验并在一个给定的可信度之上才可以得到。这是个鸡和蛋的问题。
现在的主流伪随机数生成法大概都是乘/加同余法及其变体吧,就是利用了整数加法和乘法之间关系的高度不协调。这样生成的伪随机数,在相当置信度的统计检验下,无法分辨将其与真随机数分辨开来。绝大多数的实用中(主要是模拟计算),这样已经足够足够了。
这样生成的随机数是0-1之间均匀分布的随机数,可以很容易地将其转换为任一分布的随机数。
硬件随机数发生器都是利用了一些物理过程的随机性质。不过其中一些物理过程是否真正随机也很难说。真正随机的大概只有去量子世界找了。
1.不能
2.有。比如intel处理器现在就已经内置硬件随机数发生器。
3.不是。放大三极管PN之间的电噪声都可以得到。