【问题标题】:Looking for Algorithm Source寻找算法源
【发布时间】:2014-06-29 23:54:43
【问题描述】:

翻阅我的3卷TAOCP我找不到短随机序列的来源:

// Seed always in 1..0x10000
Seed = (Seed * const) % 0x10001

还有一个算法,可能还有一个 MIX 程序来验证 const,以便返回所有 2^16 个值。至少那是我记得的。同样在相同的一般领域中,上述递归有效,因为 (2^16)+1 是素数,但是,(2^32)+1 和 (2^64)-1 都不是素数。

FWIW,将 const 替换为 iconst = 1/const (mod 0x10001) 以相反的顺序生成序列。 IE。 const*iconst%0x10001 = 1

【问题讨论】:

  • 那么你的问题是什么?
  • 问题是:这个随机递归记录在哪里?验证完整 2^16 序列的“const”的算法是什么。

标签: random taocp


【解决方案1】:

该算法是linear congruential generators(LCGs) 的变体,称为素模乘法线性同余生成器 (PMMLCG - 参见 Law 的“模拟建模和分析,5e”p.400),有时也称为Lehmer generator。我提供的两个链接都给出了共同的参数化,第一个链接给出了选择参数的规则,这将给出一个完整的循环。然而,拥有完整的周期并不是拥有一个好的生成器的充分条件,正如 IBM 以现在臭名昭著的 RANDU 毁灭性地发现的那样。

我强烈建议您仅使用经过充分测试的算法,要做到这一点非常困难。有well-researched and readily available algorithms现在广泛使用,比任何LCG都要好。

【讨论】:

  • 谢谢@pjs。我在随机部分发帖是因为我记得在 TAOCP 第 3 章中读到过这种生成器。感谢来源总是很好的。 Law 的“Simulation Modeling and Analysis, 5e”没有 $。我发现我的 x86 asm 代码从 2001 年开始全范围 consts。希望我能做出更好的 cmets.... 但是我只需要相当好的炒菜。我的预期用途是用于加密的 16 位 sbox。全周期意味着可逆性。我会在堆栈 ovf 数学部门询问 mod (2^32+1) 是否具有保证完整周期的乘数。这可以生成一个完整的 32 位 sbox 及其逆。
  • 请不要使用 任何 类型的线性同余生成器进行加密,这可以说是您可能做出的最糟糕的 PRNG 选择之一!查看我提供的 Wikipedia 链接的“LCG 的优缺点”部分,尤其是第 2 段。
猜你喜欢
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-01-29
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多