Scala函数式编程课后习题答案(第六章)
练习6.1,6.2,6.3,6.4,6.5
trait RNG {
def nextInt:(Int,RNG)
}
case class seedRNG(seed:Long) extends RNG{
def nextInt:(Int,RNG)={
val seed2 = (seed*0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFFL
((seed2 >>> 16).asInstanceOf[Int],seedRNG(seed2))
}
}
object RNG{
def double(rng:RNG):(Double,RNG) ={
val (i,rng2) = rng.nextInt
if (i == Int.MaxValue) (0.0,rng2)
else (i.toDouble/Int.MaxValue.toDouble,rng2)
}
def nonNegativeInt(rng: RNG): (Int, RNG)={
val (i,rng2) = rng.nextInt
if (i == Int.MaxValue) (Int.MaxValue,rng2)
else (i.abs,rng2)
}
def nextBoolean(rng:RNG):(Boolean,RNG)={
rng.nextInt match {
case (i,rng2) => (i%2==0,rng2)
}
}
def intDouble(rng:RNG):((Int,Double),RNG)={
val (i,rng2)= nonNegativeInt(rng)
val (d,rng3)= double(rng2)
((i,d),rng3)
}
def doubleInt(rng:RNG):((Double,Int),RNG) ={
val (d,rng2) = double(rng)
val (i,rng3) = nonNegativeInt(rng2)
((d,i),rng3)
}
def double3(rng:RNG):((Double,Double,Double),RNG)={
val (d1,rng2)= double(rng)
val (d2,rng3)= double(rng2)
val (d3,rng4)= d