C++ 如何阻止随机引擎产生负数?

dav*_*000 2 c++ random

我有一个函数,我试图生成 18 到 5 之间的随机数

int randomAge() {
  int random;
  std::random_device rd;
  static std::default_random_engine generator(rd()); //produce a static random engine
  std::normal_distribution<double> distribution(18, 52);  //random age between 18 and 52
  random = distribution(generator);
  return random;
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到负数和大于 52 的偶数。如何解决此问题,使其生成 18 到 52 之间的数字?

Ayx*_*xan 6

您正在使用std::normal_distributionwhich 根据正态(或高斯)随机数分布生成随机数。您正在使用构造函数:

explicit normal_distribution( RealType mean, RealType stddev = 1.0 );
Run Code Online (Sandbox Code Playgroud)

你想要的是std::uniform_real_distribution. 请参阅参考

产生随机浮点值 i,均匀分布在区间 [a, b)

请注意,您的引擎和发行版必须是thread_local(或static),并且随机设备可以是临时的。否则,您的结果分布不均匀。您还应该考虑获取一个随机整数而不是 double,因为int无论如何返回类型是:

#include <random>

int randomAge() {
  thread_local std::mt19937 engine{ std::random_device{}() };
  thread_local std::uniform_int_distribution<int> distribution{ 18, 52 };
  return distribution(engine);
}
Run Code Online (Sandbox Code Playgroud)

有关的: