【问题标题】:How do I generate a random number close to zero?如何生成接近于零的随机数?
【发布时间】:2011-12-03 15:19:05
【问题描述】:

我想生成一个在一定范围内接近零的数字。例如,假设我希望数字在 90% 的情况下低于 10,但有很小的机会是 15、20 甚至 30。数字越高,收到它的机会就越低。

我尝试使用关键字“加权概率”查找某些内容,但找不到任何指向正确方向的内容。


更新:

我最终使用了 Box-Muller 变换(请参阅已接受的答案)。这是我写的简单代码:

const E = 2.71828183;

function getRandomCurvedValue(temp.median, temp.density) {
  return this.getCurvedValue(random(0, 1), temp.median, temp.density);
}

function getCurvedValue(temp.value, temp.median, temp.density) {
  return temp.median + (temp.density * log(E, (temp.value / (1 - temp.value)))); 
}

【问题讨论】:

标签: math probability


【解决方案1】:

我认为您正在寻找normal distribution

正态分布有两个可以更改的变量:均值和标准差。 The mean would be 0 in your case and the standard deviation appropriately chosen so that 90 percent of values fall below 10. (Based on the tables in the Wikipedia article, I think a standard deviation of 1.645 is appropriate.)

您可以使用Box-Muller transform 作为从均匀分布随机值生成正态分布随机值的简单方法。此外,您还需要使用结果的绝对值,因为您只需要 [0, ∞) 范围内的值。

【讨论】:

  • 这是完美的,谢谢!我已将我使用的代码添加到问题的末尾。
【解决方案2】:

如果我理解正确,您只需要正随机数。在这种情况下,您可以使用例如exponentially distributed random numbers。此分布有一个参数 lambda。如果您“希望数字在 90% 的时间内低于 10”,则 lambda 可以计算为 -ln(0.1) / 10(这里 ln 是自然对数)。通常,如果您希望它以概率 p 低于 x,那么 lambda = -ln(1 - p) / x(在您的示例中,p = 0.9 和 x = 10)。您可以使用以下公式轻松生成具有给定 lambda 参数的指数分布的随机数:-ln(1 - rand()) / lambda,其中函数 rand() 是可以生成 0 到 1 之间均匀分布的随机数的函数。

【讨论】:

    【解决方案3】:

    一种可能性是生成一组随机数(对于每次迭代)。选择这些数字中的最小值作为您生成的数字。

    显然,您选择的数字越多,您的最小数字就越小。

    示例:假设您在集合中生成了两个随机数,9 和 10。选择 9 是因为它是最小的。

    假设你在你的集合中生成了四个随机数,9、10、11 和 8。选择 8 是因为它是你最小的。

    同样使用这种方法,重要的是你有一个选择数字的范围,比如从 1 到 100...(这是一个限制因素)

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 2021-01-05
      • 2013-09-14
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2023-01-28
      • 2011-02-19
      • 2011-10-19
      相关资源
      最近更新 更多