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