C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 生成一组大小为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);
}

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

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

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

解决方法

是不可能的.

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

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

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

例如,您可以使用a binomial distribution.

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

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

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

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

>在您感兴趣的整数范围内计算高斯CDF
>偏移并略微缩放以虑缺失的尾部(因此它从0变为1)
>将其存储在一个数组中

要从此分布中进行抽样:

>在[0:1]范围内生成均匀实数
>使用二进制搜索来反转CDF

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

大佬总结

以上是大佬教程为你收集整理的c – 生成一组大小为N的整数的最佳方法,如同正态分布一样,给定均值和标准.偏差全部内容,希望文章能够帮你解决c – 生成一组大小为N的整数的最佳方法,如同正态分布一样,给定均值和标准.偏差所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。