Scala中[0,N]中的随机整数

时间:2014-12-17 09:11:15

标签: scala random monads

这是我之前question

的后续内容

假设我有一个RandomGen[A] monad。 这实际上是一个函数:Long => (Long, A) mapflatMap以及另一个函数certain来创建RandomGen的新实例(作为 return in Haskell)

class RandomGen[A](run: Long => (Long, A)) {

  def apply(seed: Long) = run(seed)

  def flatMap[B](f: A => RandomGen[B]): RandomGen[B] =
    new RandomGen(seed => {val (seed1, a) = run(seed); f(a)(seed1)})

  def map[B](f: A => B): RandomGen[B] =
    new RandomGen(seed => {val (seed1, a) = run(seed); (seed1, f(a))})
}

def certain[A](a: A): RandomGen[A] = new RandomGen(seed => (seed, a))

假设我还有一个随机bits

生成器
def nextbits(bits: Int): RandomGen[Int] = ...

现在我想添加新的 generator ,它产生0到给定n之间的随机数。我从java.util.Random复制了实现,并省略了n为了简单起见,def integer(n: Int): RandomGen[Int] = nextbits(31).flatMap {r => val value = r % n if (r - value + (n -1) < 0) integer(n) else certain(value) } 是2的幂的特殊情况。

{{1}}

有意义吗?

1 个答案:

答案 0 :(得分:1)

是。请注意,这只是State monad,因此如果您愿意,可以重用scalaz实现。你也可以使用map而不是flatMap,避免需要调用某些。