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

moj*_*ojo 0 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;
}
Run Code Online (Sandbox Code Playgroud)

无论我生成多少数字,它都不会产生负数.我理解为什么生成的大多数数字都在10 307 - 10 308范围内(这不是我想要的),但不是为什么数字总是正数.我尝试了几个不同的生成器(默认值mt19937,minstd_rand0),在这方面没有任何区别.

任何人都可以描述为什么会这样吗?

Bri*_*ick 7

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


Nat*_*ica 6

std::numeric_limits<double>::min()
Run Code Online (Sandbox Code Playgroud)

将返回DBL_MIN哪个是最接近0的小值可以保持.如果您想要最大的负值,那么您需要使用

std::numeric_limits<double>::lowest()
Run Code Online (Sandbox Code Playgroud)

哪个将返回-DBL_MAX哪个是double可以容纳的最大负值.