Eam*_*nne 6 c++ boost boost-random
我正在使用boost mt19937实现进行模拟.
模拟需要是可重复的,这意味着以后存储并可能重复使用RNG种子.我正在使用windows crypto api生成种子值,因为我需要种子的外部源,而不是因为任何特殊的随机性保证.任何模拟运行的输出都会有一个包含RNG种子的注释 - 因此种子需要相当短.另一方面,作为模拟分析的一部分,我将比较几次运行 - 但为了确保这些运行实际上是不同的,我需要使用不同的种子 - 所以种子需要足够长避免意外碰撞.
我已经确定64位播种应该足够了; 在大约2 ^ 32次运行后,碰撞的几率将达到50% - 这个概率足够低,以至于它造成的平均误差对我来说可以忽略不计.仅使用32位种子很棘手; 在2 ^ 16次运行后,碰撞的可能性已达到50%; 这对我的口味来说有点太可能了.
不幸的是,增强实现要么是带有完整状态向量的种子 - 这太长,太长 - 或者是一个32位无符号长 - 这并不理想.
如何为超过32位但小于满状态向量的发生器播种?我试着填充矢量或重复种子来填充状态向量,但即使粗略地看一下结果也会显示结果不佳.
你的假设是错误的。对于模拟,您不需要加密强度高的种子。事实上,使用种子 1、2、3、4 等通常是更好的主意。Mersenne Twister 的输出值将是不相关的,但没有人会质疑您是否精心挑选了种子以获得所需的模拟输出。
对于其他确实有真正需要的人,一个简单的方法是丢弃生成的第一个(种子>> 32)值。这为您提供了大约 log2(seed>>32) 额外的状态位。然而,只有当您需要一些额外的位时,它才能有效地工作。以这种方式添加 32 位可能太慢。
更快的算法是为好的随机生成器生成完整的状态向量。由于结果状态向量的随机性有限,问题中提到的解决方案(重复或填充)不太好。但如果您从 的输出填充初始状态向量mersenne_twister(seed1) ^ mersenne_twister(seed2),则这根本不是问题。