独立随机数发生器

时间:2015-12-07 17:36:06

标签: scala random

我需要在给定的scala中创建独立的随机数生成器,类似于haskell的split函数。我可以使用当前数字生成器生成整数或长整数,并将它们用作种子来创建新生成器吗?

val rng: Random 
val seed1 = rng.nextLong()
val seed2 = rng.nextLong()

val rng1 = new Random(seed1)
val rng2 = new Random(seed2)

这是一个很好的方法吗?或者它是否会破坏随机性的顺序(例如,依赖于Ints或Longs,它们可能携带的信息少于随机数生成器的实际状态)?

2 个答案:

答案 0 :(得分:1)

这取决于用于生成伪随机数的特定算法。如果文档没有承诺它提供独立的流(而Java没有),则假设它不能很好地工作。也可以使用“多个流”,“并行流”或“可拆分”等术语。

我相信MRG32k3a是最受欢迎的多流支持生成器。您可以在线轻松找到Java实现,但我所做的是GPL许可,所以我没有包含它们。 PCG也支持多个流,Spire中有Scala implementation。 (以及https://github.com/alexeyr/pcg-java处的Java实现)。

答案 1 :(得分:0)

我认为这取决于你的用例。

如果您只是想确保rngs数字独立前进(例如,每个线程或角色获得一个rng并且您希望保持确定性),那么您的方法就可以了。