繁体   English   中英

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

[英]Random integer in [0, N] in Scala

这是我先前问题的跟进

假设我有一个RandomGen[A] monad。 这实际上是一个函数: Long => (Long, A)带有mapflatMap以及另一个certain会创建RandomGen新实例的RandomGen (作为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] = ...

现在,我想添加一个新的生成器 ,该生成器生成 0到给定n之间的随机数。 我从java.util.Random复制了实现,为简单起见,省略了n为2的幂的特殊情况。

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)
  }

是否有意义 ?

是。 请注意,这只是State monad,因此您可以根据需要重复使用scalaz实现。 您也可以使用map而不是flatMap,并避免调用某些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM