如何在C ++中生成介于0.04和0.11之间的随机数?

时间:2016-10-08 01:52:31

标签: c++

如果5 + rand() % 6生成一个5到10的随机数,我将如何生成十进制数?我尝试将一个浮点变量赋给((4 + rand() % 8) / 100),但除了将变量赋值为零之外,它不会做任何事情。

2 个答案:

答案 0 :(得分:3)

就个人而言,我会选择比rand()更强大的东西(但这可能是因为我在需要高质量随机数的领域进行研究):

#include <random>

double randomDouble(double bottom, double top) {
    std::uniform_real_distribution<double> dist(bottom, top);
    std::mt19937 gen; // Mersenne Twister PRNG

    return dist(gen);
}

这个小函数使用Mersenne Twister,这是一种普通类型的PRNG,其周期(重复之前的随机数)为2 ^ 19937 - 因此得名。现在就这样称呼它:

double foo = randomDouble(0.04, 0.11);

答案 1 :(得分:0)

有两种基本方法可以转换生成rand()范围内数字的数字生成器[0, RAND_MAX],使其生成范围为[a, b]的数字:

  1. n = rand() % (b - a + 1) + a;

  2. n = rand() * (b - a + 1) / (RAND_MAX + 1) + a;

  3. 第二种方法适用于非整数ab的范围。

    请记住,除了已经提到的随机数质量问题之外,此发生器可能无法产生足够密集的目标范围覆盖范围。 RAND_MAX的值越大,覆盖范围就越密集。