Random 简单真随机数发生器

Random 简单真随机数发生器,random,von-neumann,Random,Von Neumann,有很多关于生成“真正”随机数的研究正在进行中 有一种非常简单的方法,发明于很久以前。 这种方法归功于冯·诺依曼 在最简单的形式中,它可以被认为是从0或1的偏置源中生成随机位。假设序列01的概率与10相同,则可以使用01-来表示真正随机的“0”,并将10表示为真正随机的“1”位(00和11组合被简单地丢弃) 很简单。有人能指出为什么这种方法不能生成随机序列(从而解决在计算机上生成随机数的问题) 让我解释一下“随机”和“真正随机”的含义。“随机”仅仅意味着数字的分布是相同的,并且是独立于其他任何事物

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

有一种非常简单的方法,发明于很久以前。 这种方法归功于冯·诺依曼

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

很简单。有人能指出为什么这种方法不能生成随机序列(从而解决在计算机上生成随机数的问题)

让我解释一下“随机”和“真正随机”的含义。“随机”仅仅意味着数字的分布是相同的,并且是独立于其他任何事物选择的(也就是说,数字是i.i.d.)。“真正随机”只是指身份证和制服(另见Frauchiger等人2013年)

如果输入位的来源为i.i.d.,但有偏差,则冯·诺依曼方法将消除该偏差-数字保持i.i.d.,但现在无偏差,即每个数字将以相同的概率为0或1。一般来说,如果源数字不是i.i.d.(更具体地说,是可交换的[Peres 1992]),冯·诺依曼方法不会使这些数字“真正随机”;甚至冯·诺依曼(1951)也假设“连续抛硬币的独立性”。冯·诺依曼方法是一系列可用的随机性抽取器之一(我将对此进行讨论),本讨论与冯·诺依曼方法一样适用于其他抽取器

在任何情况下,“伪随机”和“真正随机”数字之间的区别都不是应用程序所关心的(而且您也没有真正指定您心目中的应用程序类型)。相反,一般来说:

  • 安全应用程序关心数字是否难以猜测;在这种情况下,只有加密RNG可以实现此要求(即使是依赖伪随机数生成器的RNG)。Python的一个例子是
    secrets
    模块或
    random.SystemRandom
  • 科学模拟关心的是这些数字是否像独立的统一随机数一样,并且经常关心这些数字在以后是否可以复制。Python的一个例子是
    numpy.random.Generator
参考资料:

  • Frauchiger,D.,Renner,R.,Troyer,M.,“真实量子设备的真实随机性”,2013年
  • 冯·诺依曼,J.,“与随机数字有关的各种技术”,1951年
  • 佩雷斯,Y.,1992年统计年鉴,第20,1页。590-597

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