来自知乎上 @纳米黑客 的回答:
首先,「真随机」也有不同的含义, 真正的真随机目测只有量子力学了……一般的所谓真随机不是指这个,而是指 统计意义 上的随机,也就是具备不确定性,可以被安全的用于金融等领域,下面的真随机也均指这个。
答案是, 计算机理论上可以产生统计意义上的真随机数 。
大部分程序和语言中的随机数(比如 C 中的,MATLAB 中的),确实都只是 伪随机 。是由可确定的函数(比如线性同余),通过一个种子(比如时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。
直观来想,计算机是一种可确定,可预测的的设备,想通过一行一行的确定的代码自身产生真随机,显然不可能。但是, 我们或许可以迂回一下 ……
一个典型的例子就是 UNIX 内核中的随机数发生器(/dev/random),它在 理论上能产生真随机 。即这个随机数的生成,独立于生成函数,或者说这个产生器是非确定的。
实现方法呢?简单的讲就是软硬结合,或者说,引入系统外的变量(把软件,代码,算法想象成一个封闭的系统)。
具体来讲,UNIX 维护了一个 熵池 ,不断收集非确定性的设备事件,即机器运行环境中产生的 硬件噪音 来作为种子。
比如说:IO请求的响应时间, 特定硬件中断的时间间隔, 键盘敲击速度,鼠标移动速度,甚至周围的电磁波等等……直观的说, 你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度,等等信号,都可能被用来生成随机数 。
更具体的,内核提供了向熵池填充数据的接口
比如鼠标的就是
void add_mouse_randomness(__u32 mouse_data)
内核子系统和驱动调用这个函数,把 鼠标的位置和中断间隔时间作为噪音源填充进熵池 。
Q 有的中断有规律可循,或者可以受外界控制,怎么办
A 并非所有的中断都能作为噪音源的。
所以,结论是, 程序和算法本身不能产生真随机,但是计算机系统作为整体可以迂回产生统计意义上的真随机 。
参考:
内核源码在/drivers/char/random.c
Windows 中也有相对的随机数生成器,基本的思想是一致的
如果要求更高的话,也有专用的设备,可收集附近的电磁场等环境噪音来产生随机数
下面是关于产生真随机数的讨论:
转载自http://cryolite.iteye.com/blog/199943
有关如何产生随机数的理论有许多,如果要详细地讨论,需要厚厚的一本书的篇幅。
有限状态机不能产生真正的随机数的,所以在现在的计算机中并没有一个真正的随机数生成算法,现有的随机数生成算法生产的随机数只不过因为重复的周期比较大,可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,一般称作叫伪随机数发生器。
真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。真随机数生产效率没有伪随机数高,还有就是”信息熵的信息量如果很有限的话,就不是一定是真的随机数了。”
还有人质疑真正的随机数的存在,这是哲学问题,不在此涉及。
查了下现有的真随机数生成器,比如PuTTYgen的随机数是让用户移动鼠标达到一定的长度,之后把鼠标的运动轨迹转化为种子;Intel通过电阻和振荡器来生成热噪声作为信息熵资源;Unix/Linux的dev/random和/dev/urandom采用硬件噪音生成随机数;(待补充)
基于特定Intel芯片组中random number generator(RNG)单元的真随机数生成器.在Intel 815E芯片组的个人电脑上安装Intel Security Driver(ISD)后,可以通过编程读取寄存器获取RNG中的随机数.
有人在BBS上提到:RSA的书上介绍过一种随机数发生器,根据的是劣质内存芯片工作在高温下,其数据是不可预测的,读取这里面的数据,就会得到难以预测的随机数。有采用这种技术制作随机数发生器板卡。
关于Linux系统的真随机数生成器在《Linux内核设计与实现》一书的附录B中有详细介绍
Linux自1.3.30版就在内核提供了真随机数生成器,至少是理论上能产生真随机数,它利用机器的噪音生成随机数,噪音源包括各种硬件运行时速,用户和计算机交互时速。比如击键的间隔时间、鼠标移动速度、特定中断的时间间隔和块IO请求的响应时间等。
此外还有提供真随机数的网站,如:
1。 http://random.irb.hr/ 是一个免费为学术和科研机构提供真随机数字服务的网站。全名是Quantum Random Bit Generator Service (QRBGS),由克罗地亚的计算机科学家开发。其随机性依赖于半导体光子发散量子物理过程中内在的随机性,光子通过光电效应进行检测。这些随机检测到的光子都是相互独立的。
可以通过C/C++库、Web Service、Mathmatic/Matlab插件等多种方式访问。将来会提供基于SSL的安全访问。
它甚至还有个小小的Erlang的客户端访问程序
http://code.google.com/p/qrbgerl/
有人还提到
用Java可以使用java.security.SecureRandom 产生真随机数(待查);
Linux系统有/dev/random,/dev/urandom向用户提供真随机数;
Windows系统有CryptGenRandom 函數生成真随机数(待查)
在《数字追凶 numb3rs》第6季中有一集是通过预测彩票所采用的伪随机数算法进行彩g票f诈w骗的。
2010年,德国研究人员开发出一种产生真随机数的新方法,他们希望能改进互联网安全。
随机数是计算机和互联网安全的重要组成部分,网站和浏览器利用一把会话钥匙加密两者之间发送的数据。伪随机数可以预测和破解,研究人员一直在研究能产生真正的、无法预测的随机数方法。德国的研究团队现在开发出一种真随机数发生器,它使用的计算机内存双态触发器作为随机的一个额外层,触发器可随机的在1或0状态中切换,在切换之前,触发器处于行为无法预测的“亚稳态”。在亚稳态结束时,内存中的内容为完全随机。研究人员对一个触发器单元阵列的实验显示,这种方法产生的随机数比传统方法“随机”约20倍。
经典物理学不存在真正的随机性,而量子世界从本质上讲就是真正随机的,是不可预测的。根据发表在2010年4月最新一期《自然》杂志上的报告,比利时物理学家S. Pironio和同事利用“远距离的幽灵般作用”创造出了真随机数。
他们利用了纠缠粒子的随机性和非局域性属性。研究人员首先在理论上发现,一个“贝尔不等式”的破坏证明新的随机性的产生,它独立于任何实现细节。为了阐释该方法,他们随后进行了一个实验,在该实验中,正如用他们创建的理论工具所证实的那样,产生了42个新的随机位。研究人员称,这项研究可用于设计出真正的无法预测随机数生成器。
http://developers.solidot.org/article.pl?sid=10/02/23/0645203
http://www.sciencedaily.com/releases/2010/02/100222082529.htm?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+sciencedaily+(ScienceDaily:+Latest+Science+News)
2011年,加拿大渥太华的物理学家Ben Sussman利用激光脉冲和钻石创造了真随机数。用真随机数编码的信息将难以被黑客破解。
Sussman的实验室使用持续几万亿分之一秒的激光脉冲照射钻石,激光进入和出来的方向发生了变化。Sussman称改变与量子真空涨落的相互作用有关,量子力学与大多数物理学法则不同,不可能知道真正发生了什么。他认为这可以用于创造真正的随机数。
2012年,史上最快的随机数生成器:从真空中的亚原子噪音获取随机数
量子力学告诉我们亚原子对会持续自发的产生和湮灭,即使是在真空里也一样。通过监听真空内亚原子粒子量子涨落产生的噪音,澳大利亚国立大学的科学家们建造了世界上最快的随机数发生器。研究小组开发了可以通过激光监听真空中随机噪音的工具并以此产生真正的随机数。
随机数生成网页
http://article.yeeyan.org/view/219269/266017
参考:
http://www.cnblogs.com/hehehu/archive/2005/08/23/221125.html
http://bbs.chinaunix.net/viewthread.php?tid=1054170&extra=&page=1
DOTA里斧王的反击螺旋等采用的是伪随机。。。。。。