なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Memento

 Mementoパターン。
GoF23パターンのうち、パターン名がラテン語なのはこれだけ。
 
擬似乱数発生装置を作ってみた。
16bitの乱数を生成する。
 
アルゴリズム混合合同法
Seed値固定の場合はn番目に得られる数値はいつも同じ。
 

package designpattern.memento

object RandomNumberGenerator {
var index = 0
var a = 0xF8D1
val p = 0x34
val q = 0x3B5

def getRandomNumber = {
index += 1
a = ((a * p + q) >> 2 ) & 0xFFFF
a
}

def createMemento = new Memento(a)

def setMemento(m: Memento) = {
a = m.getValue
}
}

class Memento(value: Int) {
def getValue = value
}

object CareTalker {
private var map = Map[Int, Memento]()
def addMemento(index: Int, m: Memento) = map += (index -> m)
def getMemento(index: Int): Memento = {
map.get(index) match {
case Some(x) => x
case None => throw new RuntimeException("Null!")
}
}
}

object Main {
def main(args: Array[String]) = {
val generator = RandomNumberGenerator
println(generator.getRandomNumber.toHexString)
println(generator.getRandomNumber.toHexString)
CareTalker.addMemento(generator.index, generator.createMemento)

val memento = CareTalker.getMemento(2)
generator.setMemento(memento)
println(generator.getRandomNumber.toHexString)

generator.setMemento(memento)
println(generator.getRandomNumber.toHexString)
}
}