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