Skip to content

Commit

Permalink
数値: 乱数を得る (途中) #4
Browse files Browse the repository at this point in the history
  • Loading branch information
YoshikuniJujo committed May 18, 2017
1 parent 4fa7199 commit 8456719
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions 数値/乱数を得る.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

#### 特徴
Expand Down

0 comments on commit 8456719

Please sign in to comment.