【问题标题】: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;