随机函数如何能够真正实现随机?

5

介绍

我知道这个问题可能会让我失去很多声誉,也知道它可能会被标记为不合适的问题,但我真的很好奇,所以如果有任何机会得到至少一个答案,我就不放弃。

问题

今天我醒来想着:

嘿,如果随机函数是由算法创建的,那么它们怎么可能是真正的随机呢?

想一想。你怎么能创建一个模拟随机性的函数,而没有随机的概念已经内置其中呢?我开始思考:

嘿,我会取一个 int 数组,然后做 [某些事情],然后再做 [某些事情],再做 [某些事情],然后我只选择奇数……等等

但这似乎更像是使选择变得更加混乱而不是真正的随机性。

是否可能创建随机性?返回随机整数的函数是如何创建的(例如 PHP 中的 rand())?它们如何模拟随机性?


真相是:他们不行。你无法通过数学方法创建真正的随机性。但是,你可以生成随机性。在99%的情况下,这已经足够好了。我确信以前已经在这里问/回答过此类问题;如果你担心因为路过的投票者而失去大量声誉,请搜索一下。 - Cody Gray
可能是how does random() actually work?的重复问题。 - ire_and_curses
5个回答

4

算法生成的所谓随机数是伪随机数生成器。如果您知道生成序列所使用的种子,那么这些数字是可以预测的。序列本身是统计上随机分布但并非真正的随机。

真正的随机数生成器通常涉及从物理世界中采样随机性的一些硬件,例如放射性或声学噪声。一个天真的实现方式是采样硬盘访问和鼠标移动。请参见random.org获取真正的RNG。

必看xkcd漫画:

getRandomNumber()...


一种非放射性的硬件实现 http://www.youtube.com/v/7n8LNxGbZbs&hl - Dr. belisarius
@belisarius 这是一个真实的鲁伯·戈尔德堡机器! - Mr.Wizard

1

它们被称为伪随机数,这是有原因的;它们不是真正的随机数。来自维基百科:

伪随机数生成器(PRNG),也被称为确定性随机比特生成器(DRBG),是一种用于生成近似随机数属性的数字序列的算法。该序列并非真正随机,因为它完全由一个相对较小的初始值集合(称为PRNG状态)所决定。


1

如果你想了解背后的数学知识,可以阅读这本开创性的著作第2卷第3章。你可以购买它放在书架上以显示自己的博学(但请记住,大多数购买者最终都没有真正阅读它——有很好的理由,因为它非常深奥、难以理解)。简短的回答是,纯粹通过算法生成的“随机”数字是伪随机的,也就是说它们足够“随机”。


0

你可能想要查看维基百科关于PRNGS的文章 - 这是我们在个人电脑上拥有的所有随机数生成器。

关于最接近随机的方法,我认为可以使用CPU温度或其他传感器读数作为其中一个种子。如果种子是随机的(温度不太可能完全相同),那么序列就尽可能接近随机。


0
我通常会“获取毫秒数”,然后将其除以一个伪随机数。这样可以使它更加随机和不可预测。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接