我正在使用 boost mt19937 实现进行模拟。
模拟需要可重现,这意味着存储并可能在以后重复使用 RNG 种子。我正在使用 windows 加密 api 来生成种子值,因为我需要种子的外部来源,而不是因为任何特定的随机性保证。任何模拟运行的输出都会有一个包含 RNG 种子的注释 - 所以种子需要相当短。另一方面,作为模拟分析的一部分,我将比较几次运行——但为了确保这些运行实际上是不同的,我需要使用不同的种子——所以种子需要足够长避免意外碰撞。
我已经确定 64 位播种就足够了;在大约 2^32 次运行后,发生碰撞的几率将达到 50%——这个概率足够低,以至于它引起的平均错误对我来说可以忽略不计。仅使用 32 位种子是很棘手的;在 2^16 次运行后,发生碰撞的几率已经达到 50%;这对我的口味来说有点太可能了。
不幸的是,boost 实现要么是具有完整状态向量的种子——它太长了——要么是一个 32 位无符号长的种子——这并不理想。
如何使用超过 32 位但小于完整状态向量的生成器播种?我尝试只是填充向量或重复种子来填充状态向量,但即使粗略地看一下结果也表明这会产生糟糕的结果。