【问题标题】:Random number from many other random numbers, is it more random?许多其他随机数中的随机数,它更随机吗?
【发布时间】:2017-07-22 10:50:13
【问题描述】:

我们想从区间 [0, 1] 中生成一个统一的随机数。
让我们首先生成 k 个随机布尔值(例如,通过 rand() 假设我们有任意精度。

这样生成的随机数会比通常的 rand() 更“随机”吗?

PS。我猜子间隔选择相当于只选择输出 0 的二进制表示。b_1 b_2 b_3... 一次一位数字 b_i,最后一步是将 rand() 的表示添加到输出的末尾。

【问题讨论】:

  • “通常的”rand() 是相当随机的。你想解决什么问题?
  • 这更像是一个理论问题。但在某些情况下,我们可能需要“更随机”的随机数。例如在洗牌中,52!很大,有人可以利用 rand() 的属性来发挥自己的优势(只能生成一小部分可能的 shuffle)。
  • 组合随机源的常用方法是使用异或,在这种情况下,无论您使用什么异或,输出的随机性都不会低于最随机的输入,并且可能更随机。

标签: algorithm random


【解决方案1】:

这取决于“更随机”的定义。如果你使用更多的随机生成器,这意味着更多的随机状态,这意味着循环长度会更大。但循环长度只是随机生成器的一个属性。 2^64 的周期长度几乎可以用于任何目的(我知道的唯一例外是,如果您需要很多不同的长序列,例如用于某种模拟)。

但是,如果你将两个糟糕的随机生成器结合起来,它们不一定会变得更好,你必须对其进行分析。但是有生成器确实以这种方式工作。例如,KISS 就是一个例子:它结合了 3 个不太好的生成器,结果是一个很好的生成器。

对于洗牌,您需要一个加密 RNG。即使是非常好的但不是加密的 RNG 也不足以达到此目的。例如,好的RNG Mersenne Twister 不适合安全洗牌!就是因为观察输出的数字,可以推测出它的内部状态,所以可以预测shuffle的结果。

【讨论】:

    【解决方案2】:

    这会有所帮助,但前提是您对第一位和最后一位使用不同的伪随机生成器。 (不一定是不同的伪随机算法,只是不同的种子。)

    如果您使用相同的生成器,那么您仍然只能构造 2^n 个不同的 shuffle,其中 n 是随机生成器状态中的位数。

    如果您有两个生成器,每个都有 n 位状态,那么您最多可以产生总共 2^(2n) 个不同的 shuffle。

    【讨论】:

      【解决方案3】:

      修补随机数生成器,就像您通过仅使用一位随机空间然后迭代调用所做的那样,通常会削弱其随机属性。所有 RNG 都未能通过一些随机性统计测试,但如果您开始进行多次调用并将它们组合起来,您更有可能会发现一个明显的循环突然出现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        相关资源
        最近更新 更多