Skip to content
Snippets Groups Projects
Randoms.scala 702 B
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)
  }
}