生成1到无穷大之间的随机整数

时间:2014-07-08 11:51:33

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

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

我生成0到2之间的随机值R.

参加系列

enter image description here

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

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

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

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

2 个答案:

答案 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是期​​望的均值。