【发布时间】:2014-09-27 10:03:35
【问题描述】:
我的任务是将一些 python 代码移植到 Scala 以进行研究。 现在我使用 Apache Math3 公共库,但在使用 MersenneTwister 时遇到了困难。
在 Python 中:
SEED = 1234567890
PRIMARY_RNG = random.Random()
PRIMARY_RNG.seed(SEED)
n = PRIMARY_RNG.randrange((2**31) - 1) #1977150888
在 Scala 中:
val Seed = 1234567890
val PrimaryRNG = new MersenneTwister(Seed)
val n = PrimaryRNG.nextInt(Int.MaxValue) //1328851649
我在这里缺少什么?两者都是 MersenneTwister 的,
和Int.MaxValue = 2147483647 = (2**31) - 1
【问题讨论】:
-
真的很好奇 - 为什么 MersenneTwister 比 Java util 生成的 UUID 更好?
-
好问题 - 在 python 源代码中,他们说它是最好的,老实说,虽然它超出了问题的范围,因为我正在复制结果。但我也很好奇
-
您是否也尝试过 colt 只是为了了解这些实现之间的区别?另外,既然它是一个随机数生成器(除非我误解了),为什么值不能不同?
-
因为它是一个伪随机数生成器,所以如果你给它一个种子,第一次调用总是会产生相同的数字。此外,我将 Apache Math3 用于许多其他功能,包括 2 个数学库有点浪费,afaik Math3 也非常全面。
标签: java python scala random mersenne-twister