【发布时间】: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 范围内(这不是我想要的),但不明白为什么这些数字总是正数.我尝试了几个不同的生成器(默认,mt19937,minstd_rand0),在这方面没有任何区别。
谁能描述一下为什么会这样?
【问题讨论】:
-
std::numeric_limits
::min() 仍然是正数? -
噢!我把它打印出来了,甚至没有检查。
-
是的。请改用 numeric_limits
::lowest()。 -
@tobi303,概率。在这个范围内,只是更多的数字。
-
@Atomic_alarm 哈哈,当然。有时我的写作速度比思考速度快