# std::random_device::random_device

< cpp‎ | numeric‎ | random‎ | random device

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 | 使之为隐式