C语言手册

std::random_device::random_device

来自cppreference.com
< cpp‎ | numeric‎ | random‎ | random device
 
 
数值库
常用数学函数
数学特殊函数 (C++17)
数学常数 (C++20)
浮点环境 (C++11)
复数
数值数组
伪随机数生成
编译时有理数算术 (C++11)
数值算法
(C++17)
(C++17)
插值
(C++20)
(C++20)
通用数值运算
(C++11)
位操作
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
 
 
 
random_device() : random_device(/*implementation-defined*/) {}
(1) (C++11 起)
explicit random_device(const std::string& token);
(2) (C++11 起)
random_device(const random_device& ) = delete;
(3) (C++11 起)
1) 以实现定义的 token 默认构造新的 std::random_device 对象。
2) 构造新的 std::random_device 对象,若提供则以实现定义行为利用参数 token
3) 复制构造函数被删除: std::random_device 不可复制。

异常

失败时抛出从 std::exception 派生的实现定义异常。

注解

libstdc++ 中的实现期待 token 指名随机字节的源。可能的记号值包括 "default""rand_s""rdseed""rdrand""rdrnd""/dev/urandom""/dev/random""mt19937" 和指定 mt19937 引擎的整数字符串。(除了 "default" 的记号仅在某些目标上可用。)

libc++ 中的实现在配置以字符设备为源时,期待 token 为在从它读取时产生随机数的字符设备的名字;否则它期待 token"/dev/urandom"

若提供不支持的记号则 libstdc++ 与 libc++ 均抛出异常。 Microsoft STL 完全忽略记号。

示例

演示 Linux 上 std::random_device 二种常见的可用类型

#include <iostream>
#include <random>
 
int main()
{
 
    std::uniform_int_distribution<int> d(0, 10);
 
    std::random_device rd1; // 使用 RDRND 或 /dev/urandom
    for(int n = 0; n < 10; ++n)
        std::cout << d(rd1) << ' ';
    std::cout << '\n';
 
    std::random_device rd2("/dev/random"); // Linux 上更慢
    for(int n = 0; n < 10; ++n)
        std::cout << d(rd2) << ' ';
    std::cout << '\n';
}

可能的输出:

7 10 7 0 4 4 6 9 4 7 
2 4 10 6 3 2 0 6 3 7

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
P0935R0 C++11 默认构造函数为 explicit 使之为隐式