Skip to content
Snippets Groups Projects
Randoms.scala 682 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
  def nonNegativeInt: State[RNG, Int] = for
  yield if i < 0 then -(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)