我需要生成符合正态分布的随机数,其应在1000至11000之间,平均值为7000。我想使用c++11库函数,但我不明白如何在该区间内生成数字。有人能帮忙吗?
您没有指定标准差。假设给定区间的标准差为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;
}
可能的输出:
4520.53
6185.06
10224
7799.54
9765.6
7104.64
5191.71
10741.3
3679.14
5623.84
如果你只想指定 min
和 max
值,那么我们可以假设平均值为 (min + max) / 2
。同时,我们也可以假设 min
和 max
相对于平均值来说是三倍标准差之外的。使用这些设置,我们将仅丢弃生成值的0.3%。因此,您可以添加以下构造函数:
Generator(double min, double max):
distribution((min + max) / 2, (max - min) / 6), min(min), max(max)
{}
并将生成器初始化为:
Generator g(1000.0, 11000.0);
break
语句吗? - Mattiastd::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 )
在这里,您可以找到用于随机数生成器的库: http://www.agner.org/random/?e=0,31 例如,截断正态分布已在stocc库中实现: http://www.agner.org/random/stocc.zip