std::uniform_real_distribution

来自cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
 
在标头 <random> 定义
template< class RealType = double >
class uniform_real_distribution;
(C++11 起)

产生均匀分布在区间 [a, b) 上的随机浮点值 x,分布按照概率密度函数:

P(x|a,b) =
1
b − a

std::uniform_real_distribution 满足随机数分布 (RandomNumberDistribution) 的所有要求。

模板形参

RealType - 生成器所生成的结果类型。如果它不是 floatdoublelong double 之一,那么效果未定义。

成员类型

成员类型 定义
result_type(C++11) RealType
param_type(C++11) 参数集的类型,见随机数分布 (RandomNumberDistribution)

成员函数

构造新分布
(公开成员函数)
(C++11)
重置分布的内部状态
(公开成员函数)
生成
生成分布中的下个随机数
(公开成员函数)
特征
(C++11)
返回分布参数
(公开成员函数)
(C++11)
获取或设置随机参数对象
(公开成员函数)
(C++11)
返回最小的潜在生成值
(公开成员函数)
(C++11)
返回最大的潜在生成值
(公开成员函数)

非成员函数

(C++11)(C++11)(C++20 中移除)
比较两个分布对象
(函数)
执行伪随机数分布的流输入和输出
(函数模板)

注解

从这个分布创建闭区间 [a, b] 上的分布较困难。由于舍入误差,以 std::nextafter(b, std::numeric_limits<RealType>::max()) 为第二参数并不总是有效。

多数既存实现都有一个漏洞,它们有时会返回 bGCC #63176 LLVM #18767 MSVC STL #1074)。本来以为此为 RealTypefloat 时由 LWG 问题 2524 所导致,但已经发现二者都不是触发这个 BUG 的必要条件

示例

打印 10 个 1 与 2 间的随机数

#include <iostream>
#include <random>
 
int main()
{
    std::random_device rd;  // 将用于获得随机数引擎的种子
    std::mt19937 gen(rd()); // 以 rd() 播种的标准 mersenne_twister_engine
    std::uniform_real_distribution<> dis(1.0, 2.0);
    for (int n = 0; n < 10; ++n)
        // 用 dis 变换 gen 生成的随机 unsigned int 为 [1, 2) 中的 double
        // 每次调用 dis(gen) 都生成新的随机 double
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}

可能的输出:

1.80829 1.15391 1.18483 1.38969 1.36094 1.0648 1.97798 1.27984 1.68261 1.57326