我的建议是您直接控制该过程并设置您自己的高质量随机数生成器。这里的答案都没有经过适当的测试或验证——这是一个需要考虑的重要标准。
即使在 16 位和 32 位机器上,只要并行运行其中的几个,就可以长时间制作高质量的随机数生成器 - 但需要满足某些先决条件。这在此处进行了更深入的描述
PL'Ecuyer,“高效便携的组合随机数发生器”,CACM 31(6),1988 年 6 月,742-751。
还提供了测试和验证结果。文章的可访问版本可以在网上找到。
对于 32 位实现,建议采用 M₀ = 1 + 2×3×7×631×81031 (= 2³¹ - 85) 和 M₁ = 1 + 2×19×31×1019×1789 (= 2³¹ - 249) 生成周期为 (M₀ - 1)(M₁ - 1)/2 ≡ 2×3×7×19×31×631×1019×1789×81031 ≡ 2⁶¹ - 360777242114 的随机数生成器。他们还发布了一个建议对于 16 位 CPU。
种子被更新为 (S₀, S₁) ← ((A₀×S₀) mod M₀, (A₁×S₁) mod M₁),并且可以由此产生一个 32 位值 S₀ - S₁,并将结果向上调整为M₀ - 如果 S₀ ≤ S₁,则为 1。如果 (S₀, S₁) 初始化为区间 [0,M₀)×[0,M₁) 中的整数值,则每次更新时它都保持在该区间内。您必须修改输出值以满足您的需要,因为它们的版本专门用于产生严格的积极结果;并且没有 0。
前提条件是 (M₀ - 1)/2 和 (M₁ - 1)/2 互质,且 A₀² < M₀,A₁² < M₁;根据他们的分析,推荐值 (A₀, A₁) = (40014, 40692)。还列出了允许使用 16 位或 32 位算术完成所有计算的优化例程。
对于 32 位,更新完成为 (S₀, S₁) ← (A₀×(S₀ - K₀×Q₀) - K₀×R₀, A₁×(S₁ - K₁×Q₁) - K₁×R₁),其中任何 S₀ < 0 或S₁ < 0 结果分别向上调整为 S₀ + M₀ 或 S₁ + M₁;其中(K₀,K₁)=(S₀ div Q₀,S₁ div Q₁),(Q₀,Q₁)=(M₀ div A₀,M₁ div A₁)和(R₀,R₁)=(M₀ mod A₀,M₁ mod A₁)。