我试图在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),在这方面没有任何区别.
任何人都可以描述为什么会这样吗?
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可以容纳的最大负值.
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |