如何检测整个周期的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 个数组相等,我会认为整个周期已经结束。
这种方法合理吗?
标准随机数引擎可以相互比较——当且仅当它们具有相同的状态时,它们比较相等。
因此,您可以使用以下代码轻松测量周期:
- 创建两个默认构造的生成器
- 执行一个循环,从其中一个生成器生成一个数字,并增加一个计数。
- 直到两个生成器再次比较相等。
至少在我对 std::minstd_rand0
的快速测试中,我得到的结果是
2147483646
不用说,std::minstd_rand0
比 std::mt19937
更实用(举一个明显的例子)。
我想编写一个小的(快速的)C++ 程序,它基本上 "detects" 消耗了 std::minstd_rand0
引擎的整个周期。换句话说,我想检测序列何时重复(并测量序列重复所需的时间)。我不关心目标分布(它可以是统一的)。
关于我应该如何进行的任何想法?我正在考虑的一种选择是创建两个 std::array
变量。在第一个 std::array
中,我会存储 std:minstd_rand0
返回的 10000 个第一个伪随机变量。然后,我将继续用 10000 个变量的连续块填充另一个 std::array
,并在每次传递 10000 个变量后比较 2 个数组的内容。一旦 2 个数组相等,我会认为整个周期已经结束。
这种方法合理吗?
标准随机数引擎可以相互比较——当且仅当它们具有相同的状态时,它们比较相等。
因此,您可以使用以下代码轻松测量周期:
- 创建两个默认构造的生成器
- 执行一个循环,从其中一个生成器生成一个数字,并增加一个计数。
- 直到两个生成器再次比较相等。
至少在我对 std::minstd_rand0
的快速测试中,我得到的结果是
2147483646
不用说,std::minstd_rand0
比 std::mt19937
更实用(举一个明显的例子)。