【问题标题】:Should C++ std::uniform_real_distribution<double> only generate positive numbers?C++ std::uniform_real_distribution<double> 应该只生成正数吗?
【发布时间】:2015-09-14 12:08:09
【问题描述】:

我试图在 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;
}

无论我生成多少数字,它都不会生成负数。我理解为什么生成的大多数数字都在 10307 - 10308 范围内(这不是我想要的),但不明白为什么这些数字总是正数.我尝试了几个不同的生成器(默认,mt19937minstd_rand0),在这方面没有任何区别。

谁能描述一下为什么会这样?

【问题讨论】:

  • std::numeric_limits::min() 仍然是正数?
  • 噢!我把它打印出来了,甚至没有检查。
  • 是的。请改用 numeric_limits::lowest()。
  • @tobi303,概率。在这个范围内,只是更多的数字。
  • @Atomic_alarm 哈哈,当然。有时我的写作速度比思考速度快

标签: c++ random


【解决方案1】:

您使用您提供的限制以这种方式设置它。 std::numeric_limits&lt;double&gt;::min() 给出最小的 positive double,您将其用作分布的下限。

【讨论】:

    【解决方案2】:
    std::numeric_limits<double>::min()
    

    将返回DBL_MIN,这是一个双精度可以容纳的最接近 0 的最小值。如果你想要最大的负值,那么你需要使用

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

    这将返回 -DBL_MAX,这是一个 double 可以容纳的最大负值。

    【讨论】:

      【解决方案3】:

      来自cppreference

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

      (强调我的)

      所以你只会得到正值是很正常的。

      你能说出这些线显示的是什么吗?

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

      【讨论】:

        猜你喜欢
        • 2019-05-18
        • 2020-11-12
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多