Std::uniform_real_distribution包含范围
std::uniform_real_distribution inclusive range
c++ 11 std::uniform_real_distribution(-1,1)给出了[-1,1]范围内的数字。
如何得到[-1,1]范围内的均匀实分布?
实际上它可能无关紧要,但逻辑上我试图选择一个包含范围内的值
如果从整数开始,这更容易考虑。如果你通过[- 1,1]你会期望得到-1, 0
。因为你想包含1
,你会传递[-1,(1+1)),或[-1,2)。现在你得到-1, 0, 1
。
你想做同样的事情,但使用双精度:
借用这个答案:
#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter
#include <random>
#include <iostream>
int main()
{
const double start = -1.0;
const double stop = 1.0;
std::random_device rd;
std::mt19937 gen(rd());
// Note: uniform_real_distribution does [start, stop),
// but we want to do [start, stop].
// Pass the next largest value instead.
std::uniform_real_distribution<> dis(start, std::nextafter(stop, DBL_MAX));
for (auto i = 0; i < 100; ++i)
{
std::cout << dis(gen) << "n";
}
std::cout << std::endl;
}
(查看此处运行的代码)
也就是说,在你想要的值之后找到下一个最大的双精度值,并将其作为结束值传递。
不幸的是,浮点分布的实际实现不允许您如此精确。例如,uniform_real_distribution<float>
应该在给定的一半范围内产生值,但由于舍入问题,它实际上可能在包含范围内产生值。
下面是generate_cannonical
的问题示例,其他real_发行版也出现类似的问题。
相关文章:
- 范围 v3 可以包含初始值设定项列表的工作吗?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- 包含文件中的 Typdef "未在此范围内声明"
- 包含每个 k 个列表中至少 1 个元素的最小元素范围的时间复杂度
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 包含指向自身的智能指针的对象,该指针在对象超出范围之前未重置
- 迭代在包含向量的vor in for for范围循环中迭代
- 尽管包含正确的文件,但在此范围内未声明
- 为什么即使在启用 C++11 并且我包含字符串之后,'stod'仍然没有在此范围内声明?
- 将std::lock_guard包含在额外范围内
- 如何在包含不同数字的范围内找到整数
- 按字典顺序从范围中获取下一个数字(不包含所有字符串的容器)
- -O1/2/3 与 -std=c++1y/11/98 - 如果包含,<cmath>我收到错误:"_hypot"未在此范围内声明
- 包含的功能在以后的范围内不可用
- 如何处理错误“vtkTrivialProducer :此数据对象不包含请求的范围”
- 在C++中生成一个包含负范围的随机数
- 是否为包含相同值的范围定义 std::nth_element
- Std::uniform_real_distribution包含范围