【问题标题】:Generating random integer between 1 and infinity生成 1 到无穷大之间的随机整数
【发布时间】:2014-07-08 11:51:32
【问题描述】:

我想创建一个介于 1 和无穷大之间的整数值。我想要一个概率分布,数字越小,生成的机会就越高。

我生成一个介于 0 和 2 之间的随机值 R。

拍摄系列

我想知道我的总和大于 R 的最小 m。

我需要一种快速的方法来确定 m。如果我有二进制的 R,这将非常简单,因为 m 将等于我的数字从最高有效位开始连续出现的 1 的数量加一。

此方法可以生成的整数有上限:整数值有上限,双精度也只能在 [0;2[ 区间内达到这么高。然而,这无关紧要,因为它取决于数据表示方法的准确性。

确定 m 的最快方法是什么?

【问题讨论】:

    标签: java c# random type-conversion double-precision


    【解决方案1】:

    设置不等式

    R <= 2 - 2**-m
    

    m隔离术语

    2**-m <= 2 - R
    -m <= log2(2-R)
    m >= -log2(2-R).
    

    所以看起来你想要ceiling(-log2(2-R))。这基本上是一个离散化的指数分布——指数的算法是-ln(1-U)/rate,其中U 是Uniform(0,1),1/rate 是所需的均值。

    【讨论】:

      【解决方案2】:

      我认为,直接的解决方案就可以了,因为这个系列的收敛速度非常快:

      if (r >= 2)
          throw new IllegalArgumentException();
      double exp2M = 1 / (2 - r);
      int x = (int)exp2M;
      int ans = 0;
      while (x > 0) {
          ++ans;
          x >>= 2;
      }
      return ans;
      

      【讨论】:

        猜你喜欢
        • 2016-02-14
        • 2014-04-11
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2014-04-09
        • 2011-07-07
        相关资源
        最近更新 更多