我想创建一个介于1和无穷大之间的整数值。我想要一个概率分布,其中数字越小,产生的机会就越大。
我生成0到2之间的随机值R.
参加系列
我想知道我的总和大于R的最小m。
我需要一种快速的方法来确定m。如果我有二进制R,这将是非常简单的,因为m将等于我的数字从最高有效位连续加1的数字。
此方法可以生成的整数有一个上限:整数值有一个上限,双精度也只能在[0; 2 [区间]中达到如此高的值。然而,这是无关紧要的,因为它取决于数据表示方法的准确性。
确定m的最快方法是什么?
答案 0 :(得分:1)
我认为,直接的解决方案将会很好,因为这个系列收敛速度非常快:
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;
答案 1 :(得分: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
是统一(0,1),1/rate
是期望的均值。