C ++ std :: uniform_real_distribution <double>应该只生成正数吗?

时间:2015-09-14 12:08:10

标签: c++ random

我试图在C ++中生成一些随机双打(MSVC,虽然这对我来说并不重要 - 我只是没有其他编译器来测试)我注意到我的快速程序从未生成过负数:

#include <iostream>
#include <random>
#include <ctime>

int main() {
    std::mt19937 generator(clock());
    std::uniform_real_distribution<double>
        rand_dbl(std::numeric_limits<double>::min(),
                 std::numeric_limits<double>::max());

    std::cout << "Double Limits: (" << std::numeric_limits<double>::min()
              << "," << std::numeric_limits<double>::max() << ")"
              << std::endl << std::endl;

    int total_neg = 0;
    for (int i=0; i<100; i++) {
        double d = rand_dbl(generator);
        if (d<0) total_neg++;
        std::cout << d << " ";
    }
    std::cout << std::endl << std::endl
              << "Total negative random double is: " << total_neg << std::endl;

    return 0;
}

无论我生成多少个数字,它都不会产生负数。我理解为什么产生的大部分数字都在10 307 - 10 308 范围内(这不是我想要的),但不是为什么这些数字是总是积极的。我尝试了一些不同的生成器(默认为mt19937minstd_rand0),但在这方面没有任何区别。

有谁可以描述为什么会这样?

3 个答案:

答案 0 :(得分:7)

您可以使用您提供的限制进行设置。 std::numeric_limits<double>::min()给出最小的 double,并将其用作分布的下限。

答案 1 :(得分:6)

std::numeric_limits<double>::min()

将返回DBL_MIN,这是double可以容纳的最接近0的smalles值。如果您想要最大的负值,那么您需要使用

std::numeric_limits<double>::lowest()

这将返回-DBL_MAX,这是双倍可以容纳的最大负值。

答案 2 :(得分:3)

来自cppreference

  

对于具有非规范化的浮点类型,min返回最小标准化值。

(强调我的)

所以这很正常,你只能获得正值。

你能说出这些线的显示内容吗?

std::cout << "Double Limits: (" << std::numeric_limits<double>::min()
          << "," << std::numeric_limits<double>::max() << ")"
          << std::endl << std::endl;