生成一组大小为N的整数的最佳方法,如同正态分布一样,给定均值和标准.偏差

Chr*_*oer 3 c++ statistics normal-distribution gaussian

我正在寻找一种方法来生成一组具有指定均值和标准的整数.偏差.

使用随机库,可以生成一组以高斯方式分布的随机双打,这看起来像这样:

#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);
}
Run Code Online (Sandbox Code Playgroud)

但是,对于我的应用程序,我需要整数而不是双精度.所以我的问题是,你如何生成相当于上面但是整数而不是双打?一种可能的路径是以某种方式将双打转换为整数,但我不知道随机库如何工作以了解是否可以以真正保留钟形和均值/标准的方式完成.偏差.

我应该提到这里的目标不是随机性,因为它是获得一组特定大小的整数,具有正确的均值和标准.偏差.

理想情况下,我还想指定可以产生的最小值和最大值,但即使是双打也没有找到任何方法,所以对此也提出任何建议.

Ben*_*igt 7

这是不可能的.

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

高斯pdf具有无限支持,如果您指定最小值和最大值,您也将拥有不同的分布.

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


例如,您可以使用二项分布.

同时求解均值和方差的方程以得到pn.然后从此分布生成样本.

如果n不是整数,则可以使用多项分布.


虽然维基百科描述了从二项式或多项式分布中采样的方法,但它们并不是特别有效.有一种方法可以从任意离散分布中有效地生成样本,您可以在此处使用.

在评论中,您澄清了您想要一个具有特定均值和标准偏差以及有限支持的钟形分布.所以我们将使用高斯作为起点:

  • 计算你感兴趣的整数范围内的高斯CDF
  • 偏移并略微缩放以考虑丢失的尾部(因此它从0到1变化)
  • 将它存储在一个数组中

要从此分布中进行抽样:

  • 生成[0:1]范围内的统一实数
  • 使用二进制搜索来反转CDF

由于截断步骤会略微降低标准偏差(并且影响平均值,如果最小值和最大值与所选平均值不等),您可能必须事先略微调整高斯参数.