このディレクトリの索引
#  [1] 授業単元: プログラミング
#  [2] rand()を使い、モンテカルロ法により円周率を求めるプログラムを作る。
#     具体的な手順として
#      ・0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする。
#      ・乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える
#      ・1:π/4 = n:r から π = 4*r/n 
#       この式に従いπを計算する。
#     参考として
#      ・rand()でx座標とy座標を求める
#        x=(double)rand()/RAND_MAX;
#  y=(double)rand()/RAND_MAX;
#  ・その点の原点からの距離rを計算する
#        r=x*x+y*y
#      ・For分で点の発生を繰り返す
#      ・点が円の内側か外側かを判定し、内側ならカウンタの変数を1増やす
#       (演算子++を使う)
#   っていうのが問題です。 

試行回数(1000).

モンテカルロ法により円周率を求める(_円周率) :-
        試行回数(_n),
        '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r),
        _円周率 is 4 * _r / _n.

'0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :-
        _x is random(1001) / 1000,
        _y is random(1001) / 1000,!.

'乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,0) :- !.
'乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :-
        '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y),
        ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y),
        _n_1 is _n - 1,
        '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r_1),
        _r is _r_1 + 1,!.
'乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :-
        _n_1 is _n - 1,
        '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r).

ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :-
        1.0 >= _x * _x + _y * _y.