2次元ランダムウォーク
Posted feedbacks - Haskell
きっともっと綺麗な書き方があると思うのですが、挑戦の意味を込めて投稿です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import System.Random
import Text.Printf
direction = [(1, 0), (0, 1), (-1, 0), (0, -1)]
printPoint :: (Int, (Int, Int)) -> IO ()
printPoint (n, (x, y)) = printf "%4d%4d%4d¥n" n x y
addPair (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)
main = do
gen <- getStdGen
mapM_ printPoint $ take 10 $ zip [1..] $ scanl addPair (0, 0) $ map (\x -> direction !! (mod x 4)) $ randoms gen
|
僕もhaskellの練習で作ってみました。長くなってしまった。乱数の使い方が難しくって強引な事(unsafeを利用している)をしたけど、mattanさんがやってるようなすっきりとした利用方法があるんですね。
>writeRW2D "file.name" 100
時刻0-99までのxy位置が書かれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import System.IO.Unsafe
import System.Random
type XYPlot a = (a,a)
random4:: IO Int
random4 = getStdRandom (randomR (0,3))
nextStep:: XYPlot Int -> IO Int -> XYPlot Int
nextStep (x,y) iorand
| rand == 0 = (x+1,y)
| rand == 1 = (x,y+1)
| rand == 2 = (x-1,y)
| rand == 3 = (x,y-1)
where rand = unsafePerformIO $ iorand
randomWalk2D:: XYPlot Int -> [XYPlot Int]
randomWalk2D (x,y) = [(x,y)]++randomWalk2D (nextStep (x,y) random4)
formatRW2D:: XYPlot Int -> String
formatRW2D (x,y) = (show x) ++ " " ++ (show y) ++ "\n"
rw2DtoStr:: Int -> [XYPlot Int]->String
rw2DtoStr count (x:xs) = show count ++ " " ++
formatRW2D x ++ (rw2DtoStr (1+ count) xs)
rw2DtoStr count [] = ""
writeRW2D::FilePath -> Int ->IO()
writeRW2D fname terminal =
writeFile fname $rw2DtoStr 0 $take terminal $randomWalk2D (0,0)
|




ytakenaka
#6806()
Rating2/2=1.00
2次元ランダムウォークをつくってみてください。
******
元は3本建てにしようかと思ったけど、上の一本に絞りました。おまけとして、3本とも下に補足しておきます。作れるようでしたら作ってみてください。
1.一次元のランダムウォークを作ってください。
1.1 データファイルに残してください。 フォーマット:時間 位置
おまけ)
可視化が簡単な処理系・プログラミング言語でしたら実際に可視化してみてください。フォーマットしたファイルをスプレッドシートやplotutilitiesなどの可視化ソフトを使って、実際に動きをかくにんしてみましょう。:-)
2.同じように2次元のランダムウォークを作ってください。
2.1 1.1と同じようにしてください。
フォーマット:時間 x位置 y位置
3.凝りたければ、アニメーションにするもよし、3次元の動きをとるもよし、自分の想像力がいかせるところまでやってみてください。
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AF
分からないというヒトへの分かりにくいヒント:
今の位置から次の時間の位置が決まるのですが、決まりかたが、乱数で一歩後退するか一歩先にいくか?ということをやればよいです。
[ reply ]