有很多关于产生“真正”随机数的研究。
很久以前就发明了一种非常简单的方法。 该方法归功于冯·诺伊曼[1]。
在最简单的形式中,它可以被认为是从0或1的偏置源生成随机位。假设序列01的概率与10相同,则可以使用01 - 表示真正的随机“0”,将10表示为真正的随机“1”位(简单地丢弃00和11组合)。
非常简单。任何人都可以指出为什么这样的方法不会生成随机序列(从而解决在计算机上生成随机数的问题)?
答案 0 :(得分:1)
让我解释一下“随机”和“真正随机”的含义。 “随机”仅表示数字相同地分布,并且独立于其他所有元素 进行选择(即数字为i.i.d.)。而“真正随机”仅表示i.i.d。和制服(另请参见Frauchiger等,2013。)
如果输入位的来源是i.i.d.但存在偏差,则冯·诺依曼(von Neumann)方法将消除此偏差-数字保持i.i.d。但现在是无偏的,即每个数字将以相等的概率为0或1。通常,如果源编号不是i.i.d。 (更具体地说,是 exchangeable [Peres 1992]),冯·诺依曼(von Neumann)方法不会使这些数字“真正随机”。甚至冯·诺依曼(von Neumann(1951))都假定“硬币连续抛弃的独立性”。冯·诺依曼方法是可用的众多随机抽取器之一(我讨论了some of them),该讨论与冯·诺依曼方法一样适用于其他抽取器。
在任何情况下,“伪随机”和“真正随机”数字之间的区别都不是应用程序关心的(您也没有真正指定要考虑的应用程序类型)。相反,通常:
secrets
模块或random.SystemRandom
。numpy.random.Generator
。
参考: