このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/393
#  [1] 授業単元:プログラミング 
#  [2]特定範囲の乱数を計算する関数を作成して、0から9ま 
#  での10種類の乱数を発生させて、それぞれの値の発 
#  生回数を調べるプログラムをかけ。 
#  

'特定範囲の乱数を計算する関数を作成して、0から9までの10種類の乱数を発生させて、それぞれの値の発生回数を調べる'(_標本数,_発生回数ならび) :-
        findall(_乱数,(
                    線形合同法による擬似乱数の発生(_標本数,10,_乱数)),
                L),
        それぞれの値の発生回数を調べる(L,_発生回数ならび).

それぞれの値の発生回数を調べる(L,_発生回数ならび) :-
        findall([N,_発生回数],(
                    for(0,N,9),
                    count(member(N,L),_発生回数)),
                _発生回数ならび).

'Aの種'(97411897).
'Bの種'(75289433).
'Xの種'(42308843).

線形合同法による擬似乱数の発生(N,M,X) :-
        定数を決定する(A,B,X0),
        X1 is (A * X0 + B) mod M,
        線形合同法による擬似乱数の発生(1,N,A,B,M,X1,X).

線形合同法による擬似乱数の発生(N,N,A,B,M,X,X).
線形合同法による擬似乱数の発生(N1,N,A,B,M,X1,X) :-
        X2 is (A * X1 + B) mod M,
        N2 is N + 1,
        線形合同法による擬似乱数の発生(N2,N,A,B,M,X2,X).

定数を決定する(A,B,X) :-
        get_time(Time),
        'Aの種'(_Aの種),
        'Bの種'(_Bの種),
        'Xの種'(_Xの種),
        A is truncate(Time) mod _Aの種 + 1,
        B is truncate(Time) mod _Bの種 + 1,
        X is truncate(Time) mod _Xの種 + 1.