【问题标题】:Simple truly random number generator简单的真正随机数生成器
【发布时间】:2013-02-25 17:25:39
【问题描述】:

关于生成“真正的”随机数的研究正在进行中。

有一个很简单的方法,很久以前就发明了。 该方法归功于冯诺依曼[1]。

在最简单的形式中,它可以被认为是从 0 或 1 的偏置源中生成随机位。鉴于序列 01 的概率与 10 相同,可以使用 01 - 将真正随机的“0”和 10 表示为真正随机的“1”位(简单地丢弃 00 和 11 的组合)。

非常简单。谁能指出为什么这种方法不会生成随机序列(从而解决了在计算机上生成随机数的问题)?

【问题讨论】:

  • 除了它不比被转换的比特流更随机的事实之外?如果我输入它“0110011001100110 ....”得到“010101 ....”,它不比原始序列更多(或更少)随机......该算法是关于从随机序列中消除偏差,而不是生成本身就是一个随机序列...
  • 从随机序列中去除偏差不等于生成随机序列吗? IE。如果每个位都是随机的,那么序列不也是随机的吗?
  • 没有。假设您的 RNG 在[0, 1] 中生成统一的随机数。如果它一直返回 0.5,它就没有偏差,但仍然不是很随机。 更好 PRNG 将为您提供无偏的、看似随机的序列,但是当您对随机数序列应用适当的变换(例如在 2D 平面中绘制成对的连续数字)时,会出现不同的模式。最后一个问题是,最终每个 PRNG 都会在一段(可能非常长的)周期后开始重复。
  • @MichaelWild 您提供的 0.5 示例无效,因为它是完全确定性的,即在某个位置会有一点“1”或“0”的概率为 1。我说的是有偏差的源,即位“a0”的概率略高于位“not a0”的概率。由于随机性并不能保证您的位 a0 始终位于奇数位置(即 11.11.11.01.11.11.11),因此仅产生“真正随机”零序列(0000 ...),因此您在结束。
  • @MichaelWild 我认为一段时间后重复序列的问题不是问题。例如,给定域输出 1..N,在每个 N 大小的序列中,每个数字都只重复一次(符合真正随机的条件)。 N之后!即使在真正随机的场景中,您也会重复自己的序列。否则你是有先验偏见的(例如,如果在 N 个数字的序列中某个数字出现两次)!

标签: random von-neumann


【解决方案1】:

让我解释一下“随机”和“真正随机”的含义。 “随机”仅仅意味着这些数字是相同分布的,并且是独立选择的(也就是说,这些数字是 i.i.d.)。而“真正随机”仅仅意味着 i.i.d.和制服(另见 Frauchiger 等人,2013 年。)

如果输入位的来源是 i.i.d.但有偏差,那么冯诺依曼方法将消除这种偏差——数字保持独立同分布。但现在是无偏的,即每个数字都是 0 或 1 的概率相等。一般来说,如果源编号不是 i.i.d. (更具体地说,可交换 [Peres 1992])首先,冯诺依曼方法不会使这些数字“真正随机”;甚至 von Neumann (1951) 也假设“连续抛硬币是独立的”。冯诺依曼方法是众多可用的随机提取器之一(我讨论了some of them),这个讨论与冯诺依曼方法一样适用于这些其他提取器。

无论如何,“伪随机”和“真正随机”数字之间的区别并不是应用程序所关心的(而且您并没有真正指定您所考虑的应用程序类型)。相反,一般来说:

  • 安全应用程序关心数字是否难以猜测;在这种情况下,只有加密的 RNG 才能实现这一要求(即使是依赖于伪随机数生成器的 RNG)。一个 Python 示例是 secrets 模块或 random.SystemRandom。
  • 科学模拟关心数字是否表现得像独立的均匀随机数,并且经常关心这些数字在以后是否可重现。一个 Python 示例是 numpy.random.Generator。

参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2013-11-09
    • 2013-10-06
    • 2013-03-18
    相关资源
    最近更新 更多