Heyho,
我正在尝试使用指数/负指数分布生成介于0.0和1.0之间的随机数。有一个article,它告诉你必须得到“分位数函数”。但结果仍然大于1.0。所以我需要以某种方式扩展我的等式。
我的目标是在一个范围内生成一个随机数,例如,更高/更低的值具有更高的概率。 (分布应该是可扩展的)
相关问题(不要将结果截断为[0,1]):
答案 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个值的直方图。 λ
的较小值给出较平坦的分布,较大的值表示更快的指数下降。
答案 2 :(得分:1)
您可以使用Math.random()
生成0.0到1.0之间的随机双精度,然后简单地取结果的平方根。这将达到预期的效果(“我的目标是在一个范围内生成一个随机数,例如更高的值具有更高的概率。)
或者那不是你想要的,因为它不是特定的指数分布,但我猜多项式是2级?