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

How to detect that the entire period of C++ random engine has been consumed

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

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

这种方法合理吗?

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

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

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

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

 2147483646

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