我正在尝试创建一个一维数组,并使用一个随机数生成器(高斯生成器,生成70的均值和标准差为10的随机数),以填充至少100个数字在0和100之间的数组.
我怎么会这样做在C?
解决方法
在C 11中,这是相对简单的使用
random header和
std::normal_distribution(
live example):
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::normal_distribution<> dist(70,10);
std::map<int,int> hist;
for (int n = 0; n < 100000; ++n) {
++hist[std::round(dist(e2))];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200,'*') << '\n';
}
}
如果C 11不是boost,也提供了一个库(live example):
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
int main()
{
boost::mt19937 *rng = new boost::mt19937();
rng->seed(time(NULL));
boost::normal_distribution<> distribution(70,10);
boost::variate_generator< boost::mt19937,boost::normal_distribution<> > dist(*rng,distribution);
std::map<int,int> hist;
for (int n = 0; n < 100000; ++n) {
++hist[std::round(dist())];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200,'*') << '\n';
}
}
如果由于某些原因,这些选项都不可能,那么您可以滚动自己的Box-Muller transform,链接中提供的代码看起来很合理.