C++ C++;-在范围内按照正态分布生成随机数

C++ C++;-在范围内按照正态分布生成随机数,c++,c++11,random,normal-distribution,C++,C++11,Random,Normal Distribution,我需要生成服从正态分布的随机数,它应该在1000到11000之间,平均值为7000。我想使用,但我不知道如何在间隔内生成数字。有人能帮忙吗?您没有指定标准偏差。假设给定间隔的标准偏差为2000,您可以尝试以下方法: #include <iostream> #include <random> class Generator { std::default_random_engine generator; std::normal_distribution<

我需要生成服从正态分布的随机数,它应该在1000到11000之间,平均值为7000。我想使用,但我不知道如何在间隔内生成数字。有人能帮忙吗?

您没有指定标准偏差。假设给定间隔的标准偏差为2000,您可以尝试以下方法:

#include <iostream>
#include <random>

class Generator {
    std::default_random_engine generator;
    std::normal_distribution<double> distribution;
    double min;
    double max;
public:
    Generator(double mean, double stddev, double min, double max):
        distribution(mean, stddev), min(min), max(max)
    {}

    double operator ()() {
        while (true) {
            double number = this->distribution(generator);
            if (number >= this->min && number <= this->max)
                return number;
        }
    }
};

int main() {
    Generator g(7000.0, 2000.0, 1000.0, 11000.0);
    for (int i = 0; i < 10; i++)
        std::cout << g() << std::endl;
}
如果您只想指定
min
max
值,那么我们可以假设平均值为
(min+max)/2
。此外,我们还可以假设
min
max
与平均值相差3个标准差。通过这些设置,我们将只丢弃生成值的0.3%。因此,您可以添加以下构造函数:

Generator(double min, double max):
        distribution((min + max) / 2, (max - min) / 6), min(min), max(max)
    {}
并将生成器初始化为:

Generator g(1000.0, 11000.0);

正态分布由两个数字决定:均值和方差。(见附件)。您可以限制输出,但它不再是正态分布。如果标准偏差比你的区间小得多,那么这个差异是微不足道的。处理它的一种方法是抽取一个随机数,如果它在间隔之外,则将其固定到间隔边。这会在你的时间间隔边缘产生小的概率尖峰。数学上更好的方法(尽管在计算上可能不好)是抛出区间之外的任何值并绘制另一个值。这样做的效果是在不改变分布形状的情况下截断分布(标准化除外)。以下是您可以如何做到这一点。我没有测试它

std::default_random_engine generator;
std::normal_distribution<double> distribution(7000.0,100.0);
double sample;
do{
    sample= distribution(generator);
}while( sample<1000.0 || sample>11000.0 )
std::默认随机引擎生成器;
标准:正态分布(7000.0100.0);
双样本;
做{
样本=分布(发生器);
}while(样本11000.0)

在这里,您可以找到随机数生成器的库: 例如,在stocc库中实现截断正态分布:

正态分布没有最小/最大值。你确定这是你想要的正态分布吗?在两个方向上都是无限的。也许1000和11000代表了两个方向上的3西格玛点?我对整个分布主题还不熟悉。如果我想在给定的时间间隔内生成一组随机数,并且具有一个平均值,那么最好的分布是什么?你想要一个截断的正态分布,也许不需要在操作符()中
返回数
之后使用
break
语句?返回是绝对的break:)不要使用这个方法。在许多情况下,这是非常无效的。很多人都有问题
std::default_random_engine generator;
std::normal_distribution<double> distribution(7000.0,100.0);
double sample;
do{
    sample= distribution(generator);
}while( sample<1000.0 || sample>11000.0 )