c++ - 在全双精度范围内,std::uniform_real_distribution 总是返回 inf
问题描述
考虑以下最小示例:
#include <random>
#include <iostream>
int main (const int argC, char* argV[] ) {
std::uniform_real_distribution<double> dist(std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
std::random_device gen;
std::cout << dist(gen) << std::endl;
return 0;
}
我希望程序基本上可以打印double
. 但是在我的机器上,输出始终是inf
. double
如果我替换为也是如此float
。
我可以很容易地想象出这种情况是如何由于 的错误实现而发生的std::uniform_real_distribution
,例如,从中提取数字的间隔长度不能表示为double
. 但是我的问题是,这确实是我的标准库实现中的一个错误,还是我错过了 C++ 标准允许的间隔的一些限制?
解决方案
对 a 的要求之一uniform_real_distribution
是两个边界之间的差小于std::numeric_limits<double>::max()
。所以你的尝试是不正确的。
作为一种解决方法,您可以将其拆分为两个生成器,一个用于负数,一个用于非负数。随机选择两个生成器之一。
请记住,范围的上限不能作为生成的数字返回。
推荐阅读
- php - Ajax 插入数据脚本无法正常工作。我该如何改进这段代码?
- java - 带有 lambda 的 Java 默认方法
- scheme - 使用方案中的参数调用不带参数的函数
- google-apps-script - onEdit() 没有捕捉到所有的变化
- html - 重定向后烧瓶变量不会传输
- postgresql - Airflow + Kubernetes 集群 + Virtualbox:调度程序错误“数据库连接无效”。
- python - 如何在 train_on_batch nan 更新后将 keras 模型恢复为以前的纪元权重
- python - sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 12 个
- php - 运行 php laravel 应用程序的问题 - Google App Engine
- html - 不断收到表单错误:JSP 中的表单标签