2011-07-16 27 views
3

我正在寻找一种方法来生成一组具有指定的平均值和性病的整数。偏差。生成一组大小为N的整数的最佳方法,如正态分布,给定均值和标准差。偏差

使用随机库,它可以生成一组分布在高斯的方式随机双打,这将是这个样子:

#include <tr1/random> 

std::tr1::normal_distribution<double> normal(mean, stdDev); 
std::tr1::ranlux64_base_01 eng; 
eng.seed(1000); 
for (int i = 0; i < N; i++) 
{ 
    gaussiannums[i] = normal(eng); 
} 

但是,对于我的申请,我需要整数,而不是双打。所以我的问题是,你如何产生上述的等价物,而不是双数的整数?采取一种可能的路径是在双打转换成整数,以某种方式,但我不知道有足够的了解随机库是如何工作的知道这是否能以一种方式,真正保留了钟形,平均/ STD完成。偏差。

我应该提到的是,这里的目的与其说是随机性的,因为它是获得一组特定大小的整数,用正确的均值和性病。偏差。

理想我也想指定的最小和可产生最大的价值,但我还没有找到任何办法,甚至对双打做到这一点,所以在这个任何建议也欢迎。

+2

当您说“高斯”时,您确实指定了最小值和最大值。你或者需要指定你的目标是什么(你需要什么样的随机性),而不是你的方法(生成“高斯”整数),或者返回并研究统计数据,以便理解为什么你的问题没有意义。 (其中,要生成整数,你需要一个离散分布,但高斯是连续的)。 –

+0

我有点看到你的观点,但我仍然认为这很有道理。我想要做的是生成一系列分布在一定范围内的整数,满足给定的均值和标准。开发。这是最重要的部分,但我也希望这些整数形成一个钟形曲线,尽管它不能是严格的高斯曲线,但我希望它尽可能地保留这个属性。也许四舍五入实际上就是这样吗? – ChrKroer

+0

然后我建议你在你感兴趣的整数范围内计算一个高斯CDF,稍微拉伸以解释缺失的尾部,并将它存储在一个数组中。然后在[0:1]范围内生成一致实数,并使用二分搜索来反转CDF。这个从任意CDF生成样本的过程非常标准。 –

回答

6

这是不可能的。

高斯分布是连续的,整数集合是离散的。

高斯PDF有无限的支持,如果您指定的最小和最大你也有不同的分布。

你真的想做什么?这只是平均值和标准偏差吗?其他分布具有明确的均值和标准差,包括几个离散分布。


例如,您可以使用a binomial distribution

同时求解均值和方差的方程式得到pn。然后从这个分布生成样本。

如果n不出来整数,您可以改为使用多项分布。


尽管维基百科描述了从二项式或多项式分布中抽样的方法,但它们并不是特别有效。有一种方法可以从任意的分布式分布中高效地生成样本,您可以在这里使用它。

在评论,你澄清,你想与特定的平均值和标准偏差和有限支持的钟形分布。因此,我们将利用高斯为出发点:

  • 计算高斯CDF跨越
  • 抵消你感兴趣的整数范围略有扩大它考虑到丢失的尾巴(因此而改变从0到1)
  • 它存储在一个阵列

要从这种分布进行采样:

  • 产生均匀的意图在范围LS [0:1]
  • 使用二进制搜索反转CDF

作为截断步骤会稍微降低的标准偏差(并影响平均另外,如果最小和最大不与选定的平均值等距),您可能必须事先略微调整高斯参数。

+0

我想这样做的一些天真的方法是从[-1,+ 1]生成统一数字,并将它们中的N加起来得到范围[-N,+ N]中的数字。尽管如此,这将产生与高斯不同的分布。 –

+0

@Mike:如果这些是连续的随机变量,它们的和将具有与高斯非常相似的分布(由中心极限定理)。如果你的意思是从离散集合{-1,1}绘制,那么是的,它将是非高斯的(尽管CDF仍然非常接近高斯)。 –

+0

是的,我的意思是{-1,+1},而不是实数。他可以设置平均值和标准偏差,也可以通过对输出进行重新调整,但强制任意的最小值和最大值会很棘手。 –

相关问题