System.Random ってどんな乱数法なんだ?

This entry was posted by on Tuesday, 7 March, 2006
>前に >GHC の System.Random は線型合同法みたいだ >
ということを書いたのだが、今更ながらちょっと本当なのかどうなのかが気になっている。
> >改めて見てみると、 randomIvalInteger は乱数の種から繰り返し次の乱数を発生させているだけで(乱数の取りうる範囲によって、何個先の乱数にするかを変えている)、実際には stdNext という関数(RandomGen の next メソッドの実体)が乱数を生成している。 > >で、この stdNext という関数が何をやっているかというと、まず乱数の種は内部に数値を2つ持っていて、 stdNext ではその2つとも更新しつつ、2つの差によって次の値を計算しているようだ。 > >stdNext :: StdGen -> (Int, StdGen)
stdNext (StdGen s1 s2) = (z', StdGen s1'' s2'')
where z' = if z %lt; 1 then z + 2147483562 else z
z = s1'' - s2''

k = s1 `quot` 53668
s1' = 40014 * (s1 - k * 53668) - k * 12211
s1'' = if s1' %lt; 0 then s1' + 2147483563 else s1'

k' = s2 `quot` 52774
s2' = 40692 * (s2 - k' * 52774) - k' * 3791
s2'' = if s2' %lt; 0 then s2' + 2147483399 else s2' > >この更新方法は線型合同法とは違う気がするが、何せ乱数には明るくないのでどういう名前で呼ばれるのかがよくわからない。どれくらい良い乱数なのかもよくわからない。答えを知っている人がいたらご教示いただければ幸いです。 >

Comments are closed.