我正在寻找一种方法来生成一组具有指定均值和标准差的整数。偏差。
使用随机库,可以生成一组以高斯方式分布的随机 double ,这看起来像这样:
#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);
}
但是,对于我的应用程序,我需要整数而不是 double 。所以我的问题是,如果不是整数而不是 double ,你将如何生成上面的等价物?一种可能的方法是以某种方式将 double 转换为整数,但我对随机库的工作方式知之甚少,无法知道这是否可以以真正保留钟形和均值/标准差的方式完成.偏差。
我应该提一下,这里的目标与其说是随机性,不如说是获得一组具有正确均值和标准差的特定大小的整数。偏差。
理想情况下,我还想指定可以产生的最小值和最大值,但我还没有找到任何方法来做到这一点,即使是 double ,所以也欢迎提出任何建议。
最佳答案
这是不可能的。
高斯分布是连续的,整数集是离散的。
高斯 pdf 有无限支持,如果您指定最小值和最大值,您也会有不同的分布。
你到底想做什么?是否只有均值和标准差才算数?其他分布具有明确定义的均值和标准差,包括几个离散分布。
例如,您可以使用 a binomial distribution .
同时求解均值和方差方程得到 p 和 n。然后从此分布生成样本。
如果 n 不是整数,您可以改用多项式分布。
虽然维基百科描述了从二项式或多项式分布中抽样的方法,但它们并不是特别有效。您可以在此处使用一种从任意离散分布高效生成样本的方法。
在评论中,您阐明了您想要一个具有特定均值和标准差以及有限支持度的钟形分布。所以我们将使用高斯作为起点:
- 在您感兴趣的整数范围内计算高斯 CDF
- 稍微偏移并缩放它以解决丢失的尾部(因此它在 0 到 1 之间变化)
- 存储在一个数组中
从这个分布中抽样:
- 在 [0:1] 范围内生成均匀的实数
- 使用二分查找反转CDF
由于截断步骤会稍微降低标准差(如果最小值和最大值与所选平均值不等距,也会影响平均值),您可能需要事先稍微调整高斯参数。
关于c++ - 生成一组大小为 N 的整数的最佳方法,分布像正态分布,给定均值和标准差。偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6718724/