人気ブログランキング | 話題のタグを見る

ギャンブラーの錯覚をHaskellで実験してみた。

ギャンブラーの錯覚をHaskellで実験してみた。ルーレットの赤と黒を1と0で表し、赤が4回続いたら黒に1枚、黒が4回続いたら赤に1枚賭けることにした。

プログラム名:bet.hs
import System.Random

main = do
  gen <- getStdGen
  print 1
  print $ take 50 $ (randomRs (0,1) gen :: [Int])
  print $ sum $ take 50 $ get (randomRs (0,1) gen :: [Int])
  gen <- newStdGen
  print 2
  print $ take 50 $ (randomRs (0,1) gen :: [Int])
  print $ sum $ take 50 $ get (randomRs (0,1) gen :: [Int])
  gen <- newStdGen
  print 3
  print $ take 50 $ (randomRs (0,1) gen :: [Int])
  print $ sum $ take 50 $ get (randomRs (0,1) gen :: [Int])
  gen <- newStdGen
  print 4
  print $ take 50 $ (randomRs (0,1) gen :: [Int])
  print $ sum $ take 50 $ get (randomRs (0,1) gen :: [Int])

bet (1:1:1:1:xs) = 0
bet (0:0:0:0:xs) = 1
bet _ = 2

win xs | bet xs == xs !! 4 = 1
       | bet xs == 2 = 0
       | otherwise = -1

get ys@(x:xs) = win ys : get xs

その結果がこれ、

Main> main
1
[1,1,0,0,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,1,0,0,1,0,1,1]
-1
2
[1,1,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1]
0
3
[0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1]
-2
4
[1,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1]
2

1回目の得点が -1 、2回目が 0 、3回めが -2 、4回目が 2。

やはり、数学者は正しかった。頭の悪い管理人は実験してみないと納得できないので、Haskell でプログラムを作って実験してみるのは十分意味があるようだ。プログラマーでなくてもプログラミングを学ぶ理由はこんなところにある。数値計算の専門家でなくても、思考の道具の一つにシミュレーションを入れる時代なのかもしれない。

必勝法を編み出してカジノに行こうなどと考える前でよかった。
by tnomura9 | 2009-11-10 00:56 | Haskell | Comments(0)
<< 行政の無駄について ギャンブラーの錯覚は本当に錯覚か >>