如何生成接近零的随机数?

时间:2011-12-03 15:19:06

标签: math probability

我想生成一个接近于零且具有一定范围的数字。例如,假设我希望数字在90%的时间内都不到10%,但是它的可能性很小,只有15,20或30甚至。数字越高,接收它的机会就越小。 / p>

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


更新

我最终使用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)))); 
}

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找normal distribution

正态分布有两个可以改变的变量:均值和标准差。在你的情况下,平均值为0,并且适当选择标准偏差,使90%的值低于10.(根据维基百科文章中的表格,我认为标准差为1.645是合适的。)

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

答案 1 :(得分:3)

如果我理解你,你只需要正的随机数。在这种情况下,您可以使用例如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之间生成均匀分布的随机数的函数。

答案 2 :(得分:0)

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

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

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

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

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