← 模式

不可预测的随机数

12345678#include <random> int main() { std::random_device r; std::seed_seq seed_seq{r(), r(), r(), r(), r(), r()}; std::mt19937 engine{seed_seq}; }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

用更强的不可预测性为随机数引擎播种。

描述

伪随机数引擎通过一个种子进行初始化,该种子决定了引擎的初始状态。当使用单个 32 位值(通常由 std::random_device 提供)播种时,引擎只能处于 232 种状态之一。通过为引擎提供更多的随机种子数据,我们增加了可能的状态数量,从而提高了引擎的不可预测性。

第 4 行,我们创建了一个 std::random_device 作为非确定性随机数的来源(如果该来源可用)。在第 5 行,我们用 std::random_device 生成的几个初始种子来初始化一个 std::seed_seq。在第 7 行,我们用这个 std::seed_seq 为一个随机数引擎播种,它会为引擎提供一个偏差低且均匀分布的种子序列(尽管并非完全无偏差)。提供更多的初始种子将通过增加可能生成的种子序列数量来提高引擎的不可预测性。

虽然一个 std::seed_seq 可以用来初始化多个随机数引擎,但请记住,一个特定的 std::seed_seq 每次使用时都会产生相同的种子序列。

注意:一个不可预测的随机数引擎不一定是密码学安全的。

贡献者

  • Joseph Mansfield
  • Seth Cantrell

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享