我试图在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 范围内(这不是我想要的),但不是为什么这些数字是总是积极的。我尝试了一些不同的生成器(默认为mt19937
,minstd_rand0
),但在这方面没有任何区别。
有谁可以描述为什么会这样?
答案 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;