微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 创建具有平均和标准偏差的高斯随机发生器

我正在尝试创建一个一维数组,并使用一个随机生成器(高斯生成器,生成70的均值和标准差为10的随机数),以填充至少100个数字在0和100之间的数组.

我怎么会这样做在C?

解决方法

在C 11中,这是相对简单的使用 random headerstd::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,链接中提供的代码看起来很合理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐