为什么mersenne_twister_engine保证某些结果?

时间:2019-02-25 23:32:43

标签: c++ c++11 random

我在cppreference's article for std::mersenne_twister_engine(例如std::mt19937)上注意到以下内容:

  

需要使用第10000次连续调用默认构造的std::mt19937才能产生值4123659995

     

需要使用第10000次连续调用默认构造的std::mt19937_64才能产生值9981545732273789042

假设对标准的这种解释是正确的,那怎么办?为什么存在这些保证?这不是非随机吗?

2 个答案:

答案 0 :(得分:4)

从提案中,N1398

  

用户如何才能确信随机数引擎的实现与指定的完全相同,并正确考虑了平台特有的 [sic] (例如,奇数整数)?毕竟,实现中的小错别字可能并不明显。产生的数字可能看起来“随机”。因此,该提案为每个引擎指定了默认构造的引擎对象生成的随机数序列中的第10000个数字。

因此,它只是一个相对任意的“起点”,被选择为确保实现与PRNG语义相一致的一种方式。

这本身不是语义上的约束;这是实现符合要求的 verification

IMO可能会在标准文本中添加注释,因为这是仔细检查实施质量的空前方式。 (我不知道可以通过标准文本本身中提供的示例数据来验证其实现的QoI的任何其他功能。)

贷方应为Blastfurnace支付first arriving at this notion

答案 1 :(得分:2)

所有技术上有用的随机数生成器都是随机生成器(wikipedia)。这意味着它们有一个种子,并根据给定的种子产生100%相同的序列。这是在蒙特卡洛模拟等应用程序中的关键要求,在这种情况下,您可能会遇到罕见的问题或错误,如果没有此功能,就不可能开发出任何稳定的复杂蒙特卡洛模拟序列。

因此随机数不会产生随机数。它们产生的数字序列在任何距离或非常长的距离上都具有零相关性。

在您的示例中,默认初始化仅对应于此类序列中的一种。