6回目のHaskell

今日のお題は"rand.c"擬似乱数の生成です。アルゴリズムは最も単純な線形合同法。適当に決めた定数をかけて足して下位ビットと取ってくるだけです。乱数の制度としてはあまり使い物にならないですが殆どのC++コンパイラのrand()の実装は線形合同法らしいです。まあ今はHaskellの実装の練習なので実用的な乱数を作るつもりは全く無いのでちゃっちゃと実装しました。

main = do n <- getLine >>= return . read
          print( take 20 $ rand n )

rand n = n : ( map (\m -> ((m * 1103515245 + 12345) `div` 65536 `mod` 32768 )) ( rand n ) )

定数も忠実に移植しているのでえらい具体的な実装です。まあ練習ですから気にしません(ぉ

ひょっとしたらモナドで作れるんじゃないかといろいろ考えたんですが思いっきり挫折しましたorz モナドの壁は高すぎる。まあそのうちに出来たらなぁと考えていますが・・・まあ当分無理ですねorz