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

时间:2010-09-30 19:26:47

标签: c random

  

可能重复:
  True random number generator

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

6 个答案:

答案 0 :(得分:1)

看看这个问题: True random number generator

此外,来自维基百科的pseudorandom numbers

条目
  

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

答案 1 :(得分:1)

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

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

FWIW,我在R package random中包装了其中一个界面。

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:1)

看起来像是:

int random = CallHardwareRandomGenerator();

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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