【问题标题】:Generate random number between 0 and 1 with (negative)exponential distribution使用(负)指数分布生成 0 到 1 之间的随机数
【发布时间】:2013-12-04 21:06:40
【问题描述】:

嘿嘿,

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

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

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

【问题讨论】:

  • (当然,指数分布有无限尾,所以你必须近似......)
  • @OliCharlesworth 是否可能存在其他分布(具有 [0,1]),其行为类似于指数,x 越高,y 或 x 越高的概率越高,降低更高 y 的概率?

标签: java random probability


【解决方案1】:

负指数分布支持 [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 个值的直方图。 λ 的值越小,分布越平坦,值越大,指数下降越快。

【讨论】:

  • 谢谢 :D 我认为最困难的任务是得到我想要的东西 :D (也因为我也不确定),但这正是我想要的! (你也可以在这里测试它:petrileskinen.fi/random/randomDistribution.html)你用什么工具来生成直方图?
  • 我使用 JMP 进行很多统计分析。很高兴我能帮上忙。
【解决方案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

这有点 hacky,但它极不可能获得恰好在中间的值 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 的值,则它不太可能是极值。这样就可以控制函数的“斜率”了。

【讨论】:

  • 可能,但不是很灵活:P,随机生成器是用于游戏的,所以它应该是相当可扩展的
  • 你希望它以什么方式“弯曲”?我敢打赌我可以让它发挥作用——请告诉我。
  • 所以基本上我想要一个可以修改不同常数的函数,比如斜率。通过缩放这个斜率,更高/更低结果的概率会发生变化
  • 我已经修改了这个答案,这样你就可以让一个函数提供一个常数来确定这个函数的极性。 j > 1 的值将使其更具极性。 j
  • k,我首先需要考虑这个:D 我会回来找你的:D
【解决方案3】:

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

或者这不是你想要的,因为它不是专门的指数分布,但我猜是二次多项式?

【讨论】:

  • 这个行得通,我也试过了,问题只是我也希望较低的值可以有较高的概率
  • 我用方程 f(x) = -x² + 1 尝试了这个,但不知何故,测试结果并不真正匹配。它比指数更线性
  • 您是否希望较低的值具有较高的概率 - 因为您的问题正好相反。
  • 基本上我希望两者都能做到。它也应该是灵活的,因此更有可能获得更高的结果
  • 如果取 Math.random() 的平方根,是否可以缩放输出?所以分布发生了变化,更高的值比以前有更高的概率。
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2018-08-24
相关资源
最近更新 更多