我的任务是将一些python代码移植到Scala用于研究目的.
现在我使用Apache Math3公共库,并且遇到了MersenneTwister的困难.
在Python中:
SEED = 1234567890
PRIMARY_RNG = random.Random()
PRIMARY_RNG.seed(SEED)
n = PRIMARY_RNG.randrange((2**31) - 1) #1977150888
在斯卡拉:
val Seed = 1234567890
val PrimaryRNG = new MersenneTwister(Seed)
val n = PrimaryRNG.nextInt(Int.MaxValue) //1328851649
我在这里错过了什么?两者都是MersenneTwister的,
和Int.MaxValue = 2147483647 =(2 ** 31) – 1
解决方法:
正如我已经在评论中发布的那样,获取下一个整数的主要算法在Python和Apache Math之间是相同的(源代码here,here和here).跟踪代码似乎主要区别在于两个版本如何为生成器播种. Python版本将给定的种子转换为数组并从数组中播种,而Apache Math版本具有单独的算法,用于从单个数字播种.因此,为了使Apache Math nextnd(…)方法以Python randrange(…)方法的保存方式运行,您应该使用数组为Apache Math版本设定种子.
(我不知道Scala所以下面的代码是用Java编写的)
MersenneTwister rng = new MersenneTwister();
rng.setSeed(new int[] {1234567890});
System.out.println(rng.nextInt(Integer.MAX_VALUE)); // 1977150888
另请注意,所有其他方法(如random()与nextDouble()完全不同,因此此种子机制可能只能使nextInt(…)和randrange(…)返回相同的结果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。