Newer
Older
package readerwriter
import readerwriter.internal.State, State._
import util._
object Randoms {
def threeInts: State[RNG, (Int, Int, Int)] = ???
/*@formatter:off*/
def randomInt: State[RNG, Int] = for {
rng <- get[RNG]
(rng2, i) = rng.nextInt
_ <- set(rng2)
} yield i
/*@formatter:on*/
def nonNegativeInt: State[RNG, Int] = for {
i <- randomInt
} yield if (i < 0) -(i + 1) else i
}
trait RNG {
def nextInt: (RNG, Int)
}
case class Simple(seed: Long) extends RNG {
def nextInt: (RNG, Int) = {
val newSeed = (seed * 0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFFL
val nextRNG = Simple(newSeed)
val n = (newSeed >>> 16).toInt
(nextRNG, n)
}
}