使用(负)指数分布生成介于0和1之间的随机数

时间:2013-12-04 21:06:41

标签: java random probability

Heyho,

我正在尝试使用指数/负指数分布生成介于0.0和1.0之间的随机数。有一个article,它告诉你必须得到“分位数函数”。但结果仍然大于1.0。所以我需要以某种方式扩展我的等式。

我的目标是在一个范围内生成一个随机数,例如,更高/更低的值具有更高的概率。 (分布应该是可扩展的)

相关问题(不要将结果截断为[0,1]):

3 个答案:

答案 0 :(得分:2)

基于您希望较低和较高数字具有较高可能性的评论:

// let u,v be random real numbers from [1, 10]
x = log(u) // x is from 0.0 to 1.0, with higher probability getting higher values.
y = 1 - log(v) // y is from 0.0 to 1.0, with higher probability of getting lower values.
if abs(x - 0.5) > abs(y - 0.5):
    return x
else:
    return y

这有点令人讨厌,但它极不可能在中间0.5准确得到一个值,并且可能获得边值。它似乎符合您的要求。

编辑:在x == y时可以使用一些微调。在这种情况下,您可以使用另一个随机选择来确定要选择的内容:

if x == y:
    // let w be a random number either 1 or 2.
    if w == 1:
        return x
    else:
        return y

此外,如果应用程序要求此函数有点或多或少极性,则可以对其进行调整:

// let u,v be random real numbers from [1, K] where K > 1 
// and let j be a real number given by log(K).  j is selected by the function's caller.
x = log(u) / j
y = (1 - log(v)) / j
// The remainder of the formula is identical.

通过对j使用类似于2的值,K = 100,因此更可能是极值。如果对j使用小于10的值,则它不太可能是极值。通过这种方式,您可以控制函数的“斜率”。

答案 1 :(得分:2)

负指数分布支持范围[0,∞),因此我将您的问题解释为截断负指数的请求。具有下限l >= 0,上限h > l和费率λ的此类野兽的累积分布函数为

F(x) = (exp(-λl) - exp(-λx)) / (exp(-λl) - exp(-λh))

我们可以通过将此值设置为U,统一(0,1)随机数并求解x来找到反转:

X = -ln(exp(-λl) - (exp(-λl) - exp(-λh)) * U) / λ

由于您分别指定了0和1的下限和上限,因此会减少到

X = -ln(1 - (1 - exp(-λ)) * U) / λ

U替换为您最喜欢的U(0,1)生成器的调用,这是您生成具有所需分布的X的算法。

这是使用λ = 5生成的10,000个值的直方图。 λ的较小值给出较平坦的分布,较大的值表示更快的指数下降。

10,000 truncated exponentials with lambda = 5

答案 2 :(得分:1)

您可以使用Math.random()生成0.0到1.0之间的随机双精度,然后简单地取结果的平方根。这将达到预期的效果(“我的目标是在一个范围内生成一个随机数,例如更高的值具有更高的概率。)

或者那不是你想要的,因为它不是特定的指数分布,但我猜多项式是2级?