3

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

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

#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);
}

但是,对于我的应用程序,我需要整数而不是双精度数。所以我的问题是,除了整数而不是双精度数,您将如何生成上述等效项?一种可能的方法是以某种方式将双精度数转换为整数,但我对随机库的工作方式知之甚少,无法知道这是否可以以真正保留钟形和均值/标准的方式完成. 偏差。

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

理想情况下,我还想指定可以产生的最小值和最大值,但我还没有找到任何方法来做到这一点,即使是双打,所以也欢迎任何关于此的建议。

4

1 回答 1

7

这是不可能的。

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

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

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


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

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

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


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

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

  • 在您感兴趣的整数范围内计算高斯 CDF
  • 偏移并稍微缩放以解决缺失的尾部(因此它从 0 到 1 不等)
  • 将其存储在数组中

要从此分布中采样:

  • 在 [0:1] 范围内生成统一实数
  • 使用二分查找反转 CDF

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

于 2011-07-16T16:43:44.423 回答