嘿哟,
我正在尝试使用指数/负指数分布生成介于0.0和1.0之间的随机数。有一篇文章告诉我们需要获取"分位函数"。但是结果仍然大于1.0。因此,我需要以某种方式缩放我的方程。
我的目标是在一个范围内生成随机数,例如更高/更低的值具有更高的概率。(分布应该是可扩展的)
相关问题(不要将结果截断为[0,1]):
嘿哟,
我正在尝试使用指数/负指数分布生成介于0.0和1.0之间的随机数。有一篇文章告诉我们需要获取"分位函数"。但是结果仍然大于1.0。因此,我需要以某种方式缩放我的方程。
我的目标是在一个范围内生成随机数,例如更高/更低的值具有更高的概率。(分布应该是可扩展的)
相关问题(不要将结果截断为[0,1]):
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 个值的直方图。较小的 λ
值会产生更平坦的分布,而较大的值则显示更快的指数下降。
根据您的评论,您希望较低和较高的数字都具有更高的可能性:
// 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.
通过使用2这样的值来代替j,K = 100,则更可能成为极性值。如果使用小于10的值来代替j,则其不太可能成为极性值。以此方式你可以控制函数的“斜率”。
Math.random()
生成0.0到1.0之间的随机双精度数,然后简单地取结果的平方根。这样可以达到所需的效果(“我的目标是在一个范围内生成一个随机数,例如更高的值具有更高的概率。”)。