【问题标题】:Evenly distributed random numbers relatively prime to 2与 2 互质的均匀分布随机数
【发布时间】:2010-11-06 20:34:51
【问题描述】:

一个具体的例子

我需要生成一个介于 0 和 2 之间的随机数,包括 0 和 2。 (或在 -1、0 和 1 之间随机选择)。

天真的方法是像rand() mod 3 这样rand() 返回一个整数。这种方法不会生成统计上的随机数,除非rand() 的上限不是互质数(下限为0)。

例如,假设 rand() 返回 2 位(从 0 到 3,包括),模数将映射:

0 -> 0
1 -> 1
2 -> 2
3 -> 0

如果返回更多位,这种向 0 的偏斜显然会小得多,但无论如何,偏斜仍然存在。

一般问题

有没有办法在 0 和 n-1 之间生成一个均匀分布的随机数,其中 n 与 2 互质?

【问题讨论】:

    标签: language-agnostic discrete-mathematics random


    【解决方案1】:

    一种常见的方法是丢弃最后一个完整周期以上的随机值,并只要求一个新的随机数。

    【讨论】:

      【解决方案2】:

      这可能有助于选择您的 rand() 上限为 k*n,其中 k 是一个整数。如果 rand() 是一个好的随机生成器,那么结果将均匀分布。

      如果无法降低上限,您可以选择 k 以使 k*n 尽可能接近 rand() 上限,然后丢弃高于该数字的结果重试。

      【讨论】:

        【解决方案3】:

        请参阅my answer 来回答类似问题。

        基本上,使用您的 RNG 并丢弃 N 以上的所有内容,然后重试。为了优化,您可以使用 mod,并丢弃 n * floor(MAX / n) 以上的所有内容

        【讨论】:

          【解决方案4】:

          通用答案:您需要使用的不仅仅是 2 位数字。

          我的经验法则是生成浮点值,x, 0.0 x

          【讨论】:

          • 在下面,您仍然暴露出少量偏差,因为您使用的是浮点数(31 位数据映射到 3 个唯一值)
          • 小于尝试将 4 个值(2 位)映射到 2 个值的天文偏差。由于大多数 RNG 是 48 位的实际随机性,因此您的偏差应该是微观的。您多久会生成测量偏差所需的数十亿个数字?
          猜你喜欢
          • 1970-01-01
          • 2011-08-08
          • 1970-01-01
          • 2021-12-28
          • 2020-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多