c++ - 如何检测整个周期的C++随机引擎已经被消耗

标签 c++ c++11 random stdarray

我想编写一个小型(快速)C++ 程序,它基本上“检测”std::minstd_rand0 引擎的整个周期已被消耗。换句话说,我想检测序列何时重复(并测量序列重复所需的时间)。我不关心目标分布(它可以是统一的)。

关于我应该如何进行的任何想法?我正在考虑的一种选择是创建两个 std::array 变量。在第一个 std::array 中,我会存储 std:minstd_rand0 返回的 10000 个第一个伪随机变量。然后我会继续用 10000 个变量的连续 block 填充另一个 std::array 并在每次传递 10000 个变量后比较 2 个数组的内容。一旦 2 个数组相等,我会认为整个周期已经结束。

这种方法是否明智?

最佳答案

标准随机数引擎可以相互比较——当且仅当它们具有相同的状态时它们比较相等。

因此,您可以使用以下代码轻松测量周期:

  1. 创建两个默认构造的生成器
  2. 执行一个循环,从其中一个生成器生成一个数字,并递增一个计数。
  3. 直到两个生成器再次比较相等。

至少在我对 std::minstd_rand0 的快速测试中,我得到的结果是

 2147483646

不用说,std::minstd_rand0std::mt19937 更实用(举一个明显的例子)。

关于c++ - 如何检测整个周期的C++随机引擎已经被消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415088/

相关文章:

c++ - std::reference_wrapper 与 std::shared_ptrs 并行

c++ - 在 C++ 中初始化引用和变量

macos - 使用 Qt 构建时无法使用 C++11 功能

c# - 为什么这个方法对不同的用户吐出相同的结果

c++ - 如何将 3D 矩阵展平为数组?

c++ - 自动初始化和 const 正确性

c++11 - 将智能指针转换为基类

c++ - 不完整类型 struct std::hash 与 unordered_map 的无效使用,其中 std::pair of enum class 作为键

c# - 赛马日 - 先行 C#

algorithm - 这个简单的洗牌算法会返回一副随机洗牌的扑克牌吗?