生成没有随机函数的完全随机数?

可能重复:
真随机数发生器

前几天我和朋友聊天,我们试图弄清楚是否有可能在没有随机函数的帮助下生成完全随机的数字? 例如,在“C”中,“rand”生成伪随机数。 或者我们可以使用类似“srand(time(NULL));” 这将允许计算机从其时钟读取数字作为种子值。 因此,如果我理解到目前为止我所阅读的所有内容,那么我很确定没有随机函数实际产生真正的随机数。 如何编写一个程序来生成完全随机的数字以及代码看起来像什么?

看看这个问题: 真随机数发生器

此外,从维基百科的伪随机数输入

正如约翰·冯·诺伊曼开玩笑说的那样,“任何考虑产生随机数字的算术方法的人当然都处于罪恶状态。”

优秀的random.org网站提供基于硬件的随机数以及许多用于检索这些数据的软件接口。

这可以用于例如真正不可预测的种子或“真正的”随机数。 作为一个网络服务,你可以制作抽奖的数量有限制,所以不要试图用你的研究生蒙特卡洛模拟。

FWIW,我随机包装了R包中的其中一个接口。

简单的方法是使用PI编号的数字,

如果您有兴趣,请查看这些文章:

http://www.lbl.gov/Science-Articles/Archive/pi-random.html

http://news.uns.purdue.edu/html4ever/2005/050426.Fischbach.pi.html

请注意,这是一种简单的方法,但它有一些缺点(pi的数字中有一些已知的模式)

它看起来像:

int random = CallHardwareRandomGenerator(); 

即使使用硬件,随机性也很棘手。 有物理随机的东西(primefaces衰变是随机的,但具有可预测的平均数量,因此可以用作随机信息的来源)有些物理随机的东西足以使预测变得不切实际(这就是赌场赚钱的方式) )。

有些东西在很大程度上是不确定的(混合来自按键速度,鼠标移动和类似的东西的信息),这是很多用途的“随机性”的足够好的来源。

在数学上,我们不能产生随机性,但我们可以改善分布并使某些事情难以预测。 加密PRNG在这方面做得比大多数人更强大,但在资源方面更昂贵。

我认为这更像是一个物理问题。 如果你考虑它没有什么是随机的,它只是由于事件的复杂性使它们无法预测。 计算机是一个子系统,就像宇宙中的任何其他子系统一样,通过给它不可预测的外部输入(RTC,I / O垃圾),我们可以获得与轮盘赌轮不同摩擦,空气阻力,初始冲动相同的随机性以及我无法解决的数百万因素。

关于“真正随机”甚至意味着什么,还有很多关于哲学辩论的空间。 从实际的角度来看,即使是我们所知道的并非真正随机的源也可以用于产生几乎任何实际目的的足够接近的方式(特别是至少在当前技术中,对先前产生的比特流的全面了解)似乎不足以准确预测下一位)。 其中大部分确实涉及一些额外的硬件 – 例如,很容易将一个来源从一点点的Americ一起放在烟雾探测器之外。

还有相当多的来源,尽管它们的带宽非常低(例如,根据击键之间的间隔是偶数还是奇数CPU时钟,每次击键收集一位 – 假设CPU时钟和键盘时钟源自单独的晶体)。 OTOH,你必须非常小心这一点 – 相当多的安全漏洞(例如,在大约4.0左右的Netscape中)源于人们相信这些来源比他们实际上更随机。

虽然有许多网站从硬件源产生随机数,但从加密的角度来看,大多数网站都是无用的。 即使充其量,您只是信任您的SSL(或TLS)连接是安全的,因此没有人捕获您从网站获得的数据。