非均匀随机数发生器实现?

时间:2009-10-07 21:24:28

标签: statistics random numbers

我需要一个随机数生成器,它使用可编程平均值来选择指定范围内的数字。

例如,我需要选择2到14之间的数字,我需要随机数的平均值为5.

我经常使用随机数发生器。通常我只需要统一分发。

我甚至不知道将这种分发称为什么。

感谢您提供任何帮助或见解。

8 个答案:

答案 0 :(得分:6)

如果您对该发行版的形状感到满意,则可以使用binomial distribution。设置n = 12且p = 0.25。这将为您提供0到12之间的值,平均值为3.只需为每个结果添加2即可获得您想要的范围和平均值。

编辑:至于实施,您可以找到支持非均匀发布的所选语言的库(我written one myself for Java)。

使用统一的RNG可以相当容易地近似二项式分布。只需执行 n 试验并记录成功次数。因此,如果你有n = 10和p = 0.5,就像连续10次掷硬币并计算头数一样。对于p = 0.25,只生成0到3之间的均匀分布值,并且只将零作为成功计数。

如果你想要更有效的实现,在Knuth的计算机编程艺术第2卷的练习中隐藏着一个聪明的算法。

答案 1 :(得分:3)

你还没有说过你的发行版。关于你的具体例子,一个产生2到8之间均匀分布的函数将满足你的要求,严格按照你的要求编写:)

答案 2 :(得分:2)

如果你想要随机数的非均匀分布,那么你可能必须实现某种映射,例如:

// returns a number between 0..5 with a custom distribution
int MyCustomDistribution()
{
  int r = rand(100); // random number between 0..100
  if (r < 10) return 1;
  if (r < 30) return 2;
  if (r < 42) return 3;
  ...
}

答案 3 :(得分:1)

您可以从统一的PRNG创建非均匀的PRNG。这是有道理的,因为你可以想象得到一个返回0,1,2的统一PRNG,并通过为值0和0返回值0来创建一个新的非均匀PRNG。

如果您想要分配新的非统一PRNG的特定特征,还有更多内容。 the Wikipedia page on PRNGs涵盖了这一点,并特别提到了Ziggurat algorithm

有了这些线索,您应该可以搜索一些代码。

答案 4 :(得分:1)

基于关于非均匀生成器的Wikipedia sub-article,您似乎希望将统一伪随机数生成器的输出应用于满足所需平均值的区域分布。

答案 5 :(得分:0)

我的第一个想法是:

  • 生成0..1
  • 范围内的数字
  • 缩放到-9..9(x-0.5; x * 18)
  • 的范围
  • 移位范围5 - > -4 .. 14(加5)
  • 将范围截断为2..14(丢弃数字&lt; 2)

应该为您提供所需范围内的数字。

答案 6 :(得分:0)

您需要分布式/加权随机数生成器。 Here's a reference让你开始。

答案 7 :(得分:0)

Assign all numbers equal probabilities,

而currentAverage不等于expectedAverage(可能的边际)

 pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again)

 if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage)

   increase pickedNumber's probability by delta at the expense of all others, conserving sum=100%

 else

   decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100%

 end if

 delta=0.98*delta (the rate of decrease of delta should probably be experimented with)

结束时