【问题标题】:mt19937 and normal distributionmt19937 和正态分布
【发布时间】:2017-10-12 20:45:30
【问题描述】:

你好! 我刚开始用 C++ 编写代码,我不确定如何正确使用随机数生成器。例如,我需要 [0,30000] 范围内的数字,如何确保我不会只从我的范围内获得小数字。 我的功能:

std::random_device rd;
std::mt19937 rng(rd());
int myRand(int i) {
    std::normal_distribution<double> distribution(30, 1500);
    double temp=distribution(rng);
    if(temp<0){
        temp*=(-1);
    }
    return (int) std::round(temp)%i;
}

您介意帮我正确配置 normal_distribution 吗?

【问题讨论】:

  • 这是一个非常奇怪的分布,你在那里计算。预期的分布是什么?
  • 老实说,我在某个网站上发现了这个发行版。我只需要 [0,n] 中的大量数字。每个数字应该有相同的概率被选中。
  • 这是内置的,见uniform_int_distribution
  • 你能链接你找到的网站吗?

标签: c++ random normal-distribution mt19937


【解决方案1】:

术语“正态分布”并不意味着“正则分布”。这意味着normal distribution,由数学定义。这不是你想要的。

您正在寻找的是uniform_real_distribution,它会在给定范围内吐出浮点数。但是,它只在半开范围内这样做。

std::uniform_real_distribution<double> distribution(0, 30000);
double temp=distribution(rng);

这可能返回 0,但永远不会返回 30000。

如果你想要一个封闭范围内的整数,你可以使用uniform_int_distribution

【讨论】:

  • 值得指出的是uniform_int_distribution有一个封闭的范围。
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 2015-10-16
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多