RNG 是否有可能被种子扭曲?
Is it possible for a RNG skewed by seed?
正如问题所问,用于生成随机数的种子是否可能导致编程错误的伪随机数生成器发生偏差?如果是,导致这种情况发生的常见错误是什么?
举几个例子:
- https://banu.com/blog/42/openbsd-bug-in-the-random-function/
- Mersenne Twister 使用的旧播种程序(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html link 清楚解释)
- 旧的超级骗子(找不到 link atm)应该有 ~2^64 的周期,但一些种子给它周期 ~2^5x
另外,即使这不是一个真正的错误,很多很多生成器都会用类似
的东西来初始化自己
if seed == 0:
# comment explaining that zero is bad
seed = nonzero
或
// Due to (reasons) we only really allow seeds in [0,M)
seed = seed % M
意味着至少有两个种子会给出相同的结果。
示例:xorgens(零=>非零),java 的随机(种子是 64 位,内部状态是 48 位...),go 的 math/rand(它做这两件事,看第一行https://golang.org/src/math/rand/rng.go)
处的 Seed() 方法
正如问题所问,用于生成随机数的种子是否可能导致编程错误的伪随机数生成器发生偏差?如果是,导致这种情况发生的常见错误是什么?
举几个例子:
- https://banu.com/blog/42/openbsd-bug-in-the-random-function/
- Mersenne Twister 使用的旧播种程序(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html link 清楚解释)
- 旧的超级骗子(找不到 link atm)应该有 ~2^64 的周期,但一些种子给它周期 ~2^5x
另外,即使这不是一个真正的错误,很多很多生成器都会用类似
的东西来初始化自己
if seed == 0:
# comment explaining that zero is bad
seed = nonzero
或
// Due to (reasons) we only really allow seeds in [0,M)
seed = seed % M
意味着至少有两个种子会给出相同的结果。 示例:xorgens(零=>非零),java 的随机(种子是 64 位,内部状态是 48 位...),go 的 math/rand(它做这两件事,看第一行https://golang.org/src/math/rand/rng.go)
处的 Seed() 方法