From 845671900a14808d43d0f245cebf78db1cf76490 Mon Sep 17 00:00:00 2001 From: Yoshikuni Jujo Date: Thu, 18 May 2017 09:47:34 +0900 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E5=80=A4:=20=E4=B9=B1=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=BE=97=E3=82=8B=20(=E9=80=94=E4=B8=AD)=20#4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\343\202\222\345\276\227\343\202\213.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/\346\225\260\345\200\244/\344\271\261\346\225\260\343\202\222\345\276\227\343\202\213.md" "b/\346\225\260\345\200\244/\344\271\261\346\225\260\343\202\222\345\276\227\343\202\213.md" index 25efc67..49fa5dd 100644 --- "a/\346\225\260\345\200\244/\344\271\261\346\225\260\343\202\222\345\276\227\343\202\213.md" +++ "b/\346\225\260\345\200\244/\344\271\261\346\225\260\343\202\222\345\276\227\343\202\213.md" @@ -257,6 +257,60 @@ IO値randomIOは、手軽に乱数値を取得できる便利な値です。 ##### システムから新しい乱数の種を取り出す +たとえば、つぎのようにして、乱数列を取り出してみる。 + +```haskell +-- random +> :module System.Random +> g <- getStdGen +> take 10 $ randomRs (1, 6) g +[1,5,4,2,2,2,4,1,4,2] +> g' <- getStdGen +> take 10 $ randomRs (1, 6) g' +[1,5,4,2,2,2,4,1,4,2] +``` + +ひとつめの乱数列と、ふたつめの乱数列とは、まったく、おなじものになる。 +もちろん、これはこれで、正当な動作だ。 +しかし、2回目に取り出す乱数列が、 +1回目のものと異なるものであってほしいこともある。 +そのようなときには、関数splitを使えばいい。 + +```haskell +> g0 <- getStdGen +> (g, g1) = split g0 +> setStdGen g1 +> take 10 $ randomRs (1, 6) g +[3,4,6,2,3,4,6,3,5,2] +> g2 <- getStdGen +> (g', g3) = split g2 +> take 10 $ randomRs (1, 6) g' +[1,1,1,3,6,2,4,3,5,4] +``` + +つぎような流れとなる。 + +1. 乱数の種を取得する +2. 乱数の種を、ふたつにわける +3. そのうちの、ひとつを乱数列をもとめるのに使う +4. もうひとつは、システムに保存する + +このようにすることで、毎回、新しい乱数の種が手に入る。 +この流れをまとめた関数newStdGenがある +(ただし、並行実行でも、問題が生じないような仕組みがあるため、 +上記とまったくおなじ動作というわけではない)。 + +```haskell +> g <- newStdGen +> g +1102913371 40691 +> g' <- newStdGen +> g' +1102953385 1655838863 +``` + +関数newStdGenを使うことで、つねに、新しい乱数の種を、手に入れることができる。 + ### mwc-random #### 特徴