このディレクトリの索引

% 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1197620454/434 # 問題文 # モンテカルロ法による円周率 # 1×1の正方形と1/4円を用いて円周率を求めるプログラムを作成したい # なお、関係式、及び正方形と1/4円の図は以下の様になる # π/4:1 = P : P + Q # π = 4P/P + Q = 4P/N # πは円周率、Pは円外にある点の数、NはP + Qとする モンテカルロ法により円周率を求める(N,Pi) :- モンテカルロ法により円周率を求める(0,N,0,H), P is H / N, Pi is 4 * Pi, write_formatted('Pi = %t\n',[Pi]). モンテカルロ法により円周率を求める(M,N,H,H) :- M > N,!. モンテカルロ法により円周率を求める(M,N,H1,H) :- X1 is (random mod 7717) / 7717, Y1 is (random mod 7717) / 7717, U is X * X + Y * Y, '1に収まっていればカウント'(U,H1,H2), M2 is M + 1, モンテカルロ法により円周率を求める(M,N,H2,H). '1に収まっていればカウント'(U,H1,H2) :- U < 1, H2 is H1 + 1,!. '1に収まっていればカウント'(U,H1,H1). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/753 # [1] 授業単元: プログラミング # [2]問題文: # モンテカルロ法による円周率の近似値の計算を行うプログラムを書け。 # 生成する点の個数はキーボードから受け取るようにせよ。 # 乱数の生成にはMersenne twisterを用いよ。 # モンテカルロ法で円周率を計算する(_円周率) :- モンテカルロ法で円周率を計算する(1,10000,0,_円周率),!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- M > N,X is 4.0 * Y / N,!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- U1 is ((random mod 10000) / 10000) ^ 2, U2 is ((random mod 10000) / 10000) ^ 2, U1 + U2 =< 1.0, Y2 is Y + 1, M2 is M + 1, モンテカルロ法で円周率を計算する(M2,N,Y2,X),!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- M2 is M + 1, モンテカルロ法で円周率を計算する(M2,N,Y,X),!. % 以下のサイトは # 出典: C/C++の宿題片付けます 136代目 #874 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):モンテカルロ法で円周率を求めるプログラムを作れ。 # モンテカルロ法で円周率を求める(_試行数,_円周率) :- '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数), _円周率 is (_円内にある数 * 4) / _試行数. '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数) :- count((for(1,N,_試行数),落ちた点は円内にある),_円内にある数). 落ちた点は円内にある :- '落ちた点と原点の距離が辺の長さ(1.0)以内'. '落ちた点と原点の距離が辺の長さ(1.0)以内' :- X is ((random mod 2001) - 1000) / 1000, Y is ((random mod 2001) - 1000) / 1000, X * X + Y * Y =< 1.0,!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276810079/190 # モンテカルロ法で√2の近似値を求めたいのですが、 # ネット調べてみるとモンテカルロ法と言えばπの近似に関するばかりで・・・ # どなたか教えてくださいませ # # モンテカルロ法で√2の近似値を求める(_試行回数,_除数,X) :- count((for(1,N,_試行回数),U is (random mod _除数) ^ 2,U < _除数 * _除数 / 2),Y), X is Y / (_試行回数 / 2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/798 # [1] 授業単元:数値数理解析 # [2] 問題文(含コード&リンク): # リンク先の画像に問題文を載せています。 # ttp://www.dotup.org/uploda/www.dotup.org1315077.jpg # # 三次元空間で # x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2 # を満たす領域は半径1,高さ1の直円錐の四分の一と同じになる. # 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす領域は半径1,高さ1の直円錐の四分の一と同じになることをモンテカルロ法で示す'(_試行回数,_満足回数) :- count(( for(1,N,_試行回数), X is (random mod 10001) / 10000, Y is (random mod 10001) / 10000, Z is (random mod 10001) / 10000, 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす'(X,Y,Z,U)), _満足回数). 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす'(X,Y,Z,1) :- (X^2 + Y^2) < ((1 - Z) ^ 2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/847 # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的に # が入ったか否かを調べることで円周率を求める(モンテカルロ法)プログラムを作りなさい。 # 撃った弾の数をx、命中した数をyとする。 # '1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的にが入ったか否かを調べることで円周率を求める(モンテカルロ法)'(_円周率) :- count(( for(1,_,100000), _x is ((random mod 20001) - 10000) / 10000, _y is ((random mod 20001) - 10000) / 10000, 1.0 >= sqrt((_x ^ 2) + (_y ^ 2))), Count), _円周率 is (Count / 100000) * 4. % 以下のサイトは # [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,_x,_y,_r), _円周率 is 4 * _r / _n. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is rand(1001) / 1000, _y is rand(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. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/580 # モンテカルロ法を使って円周率を求めるものなんですが指定されたプログラム(下に載せました)に # (1)全試行回数と結果を表示する間隔をscanf()で読みそれにしたがって処理が進むようにする。 # (2)各途中経過で求めたπの近似値のうち最もπの真値(=3.14159)に近い値とその時の試行回数を最後に表示させる。 # という2つの点を加えて改良しなければならないのですがどなたか教えていただけませんか? # 限界試行回数(100000). piの仮の真値(3.14159). モンテカルロ法により円周率を求める(_試行回数,_円周率) :- 限界試行回数(_限界試行回数), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,_限界試行回数,0,_試行回数,_円周率),!. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(1001) / 1000, _y is random(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(Max,Max,_内側に落ちた累積数,Max,_r) :- _r is (_内側に落ちた累積数 / Max) * 4,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_試行回数,Max,_内側に落ちた累積数,_試行回数,_r) :- piの仮の真値の誤差範囲に入った(_内側に落ちた累積数,_試行回数,_r),!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N,Max,_内側に落ちた累積数,_試行回数,_r) :- '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N2,Max,_内側に落ちた累積数2,_試行回数,_r). '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N,Max,_内側に落ちた累積数,_試行回数,_r) :- N2 is N + 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N2,Max,_内側に落ちた累積数,_試行回数,_r). piの仮の真値の誤差範囲に入った(_内側に落ちた累積数,_試行回数,_r) :- _試行回数 > 0, piの仮の真値(_piの真値), _r is (_内側に落ちた累積数 / _試行回数) * 4, _piの真値 is floor(_r * 100000 + 0.5) / 100000,!. '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), N2 is N + 1, _内側に落ちた累積数2 is _内側に落ちた累積数 + 1,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2) :- % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。'(_分布ならび) :- findall([_n,_1,_2,_3,_4,_5,_6],( append(_,[_n|_],[10,100,100,10000,100000]), 'サイコロを_n回投げて分布を調べる'(_n,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6)), _分布ならび). 'サイコロを_n回投げて分布を調べる'(0,_1,_2,_3,_4,_5,_6,_1,_2,_3,_4,_5,_6). 'サイコロを_n回投げて分布を調べる'(N,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1) :- 賽を投げる(_賽の目), 分布の更新(_賽の目,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2), N_1 is N - 1, 'サイコロを_n回投げて分布を調べる'(N_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2,_1,_2,_3_4,_5,_6). 賽を投げる(_賽の目) :- _賽の目 is random(6) + 1. 分布の更新(1,_1_1,_2,_3,_4,_5,_6,_1_2,_2,_3,_4,_5,_6) :- _1_2 is _1_1 + 1. 分布の更新(2,_1,_2_1,_3,_4,_5,_6,_1,_2_2,_3,_4,_5,_6) :- _2_2 is _2_1 + 1. 分布の更新(3,_1,_2,_3_1,_4,_5,_6,_1,_2,_3_2,_4,_5,_6) :- _3_2 is _3_1 + 1. 分布の更新(4,_1,_2,_3,_4_1,_5,_6,_1,_2,_3,_4_2,_5,_6) :- _4_2 is _4_1 + 1. 分布の更新(5,_1,_2,_3,_4,_5_1,_6,_1,_2,_3,_4,_5_2,_6) :- _5_2 is _5_1 + 1. 分布の更新(6,_1,_2,_3,_4,_5,_6_1,_1,_2,_3,_4,_5,_6_2) :- _6_2 is _6_1 + 1. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。'(_n,_分布ならび) :- findall([_回数,_Sn,_max,_min],( append(_,[_回数|_],[10,100,1000,10000,100000]), 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min)), _分布ならび). 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min) :- findall(_合計,( for(1,_,_回数), 'コインを_n回投げて表となった回数'(_n,_合計)), L), sum(L,_Sn), max(L,_max), min(L,_min). 'コインを_n回投げて表となった合計'(_n,_合計回数) :- count((for(1,_,_n),1 is random(2)),_合計回数). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'モンテカルロ法で積分区間0-1のx^2の値を求める'(_試行回数,_値) :- count(( between(1,_試行回数,_), X is random(1000), Y is random(1000),Y =< X * X), Count), _値 is Count / _試行回数. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'π の値をモンテカルロ法で求める'(_π の値) count(( for(1,N,10000), X is random(1000) / 1000, Y is random(1000) / 1000, ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y)), Count), _π の値 is Count / (10000 / 4). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _Y. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示する'(_n) :- _p = 0.4, findall([_k,Y],( for(0,_k,_n), Y is (_p^_k) * (1-_p)^(_n-_k)), _二項分布), '分布は、**** を打って表示する'(_二項分布). '分布は、**** を打って表示する'([]). '分布は、**** を打って表示する'([[_k,Y]|R]) :- 'Yを0から100まで範囲に変換'(Y,Y2), 星並びアトムを作る(Y2,_星並びアトム), 横向きにグラフ表示(_k,_星並びアトム), '分布は、**** を打って表示する'(R). 'Yを0から100まで範囲に変換'(Y,Y2) :- Y2 is truncate(Y * 100). 星並びアトムを作る(N,_星並びアトム) :- length(L,N), all(L,'*'), concat_atom(L,_星ならぴアトム). 横向きにグラフ表示(_k,_星並びアトム) :- writef('%4c: %t\n',[_k,_星並びアトム]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'サイコロを10,100,1000,10000,100000 回投げて分布を調べよ'(N,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6) :- append(_,[_何回|R],[10,100,1000,10000,100000]), サイコロの目の頻度(0,_何回,L1,L2), writef('投げた回数..%t, 1..%t,2..%t,3..%t,4..%t,5..%t,6..%t\n',[_何回|L2]), R = []. サイコロの目の頻度(_何回,_何回,L,L) :- !. サイコロの目の頻度(N,_何回,L1,L) :- _サイコロの目 is random(6) + 1, 頻度に加算(_サイコロの目,L1,L2), N_2 is N + 1, サイコロの目の頻度(N_2,_何回,L2,L). 頻度に加算(1,[_1,_2,_3,_4,_5,_6],[_1_2,_2,_3,_4,_5,_6]) :- _1_2 is _1 + 1. 頻度に加算(2,[_1,_2,_3,_4,_5,_6],[_1,_2_2,_3,_4,_5,_6]) :- _2_2 is _2 + 1. 頻度に加算(3,[_1,_2,_3,_4,_5,_6],[_1,_2,_3_2,_4,_5,_6]) :- _3_2 is _3 + 1. 頻度に加算(4,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4_2,_5,_6]) :- _4_2 is _4 + 1. 頻度に加算(5,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5_2,_6]) :- _5_2 is _5 + 1. 頻度に加算(6,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5,_6_2]) :- _6_2 is _6 + 1. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn,そのmax、min を調べよ。'(_n) :- append(_,[_試行回数|R],[10,100,1000,10000,100000]), 試行回数の集計ならび(_試行回数,_最大値,_最小値), 整数から文字列(6,_試行回数,_試行回数文字列), writef('試行回数%t: 最大値=%t 最小値=%t\n',[_試行回数文字列,_最大値,_最小値]), R = []. 試行回数の集計ならび(_試行回数,_最大値,_最小値) :- findall(S,( between(1,_試行回数,_), count(( between(1,_n,_), 1 is random(1)), S)), L), min(L,_最小値), max(L,_最大値),!. 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # # '1 ∫ x^2dx をモンテカルロ法で求めよ 0'(_積分値) :- '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値). '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値) :- 'x^2dx をモンテカルロ法で求めよ'(0,0,_頻度), _積分値 is _頻度 / 100000. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(100000,_頻度,_頻度) :- !. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N,_頻度_1,_頻度) :- 頻度を更新する(_頻度_1,_頻度_2), N_2 is N + 1, '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N_2,_頻度_2,_頻度). 頻度を更新する(_頻度_1,_頻度_2) :- _x is random(10001) / 10000, _y is random(10001) / 10000, _y =< _x ^ 2, _頻度_2 is _頻度_1 + 1,!. 頻度を更新する(_頻度,_頻度). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'πの値をモンテカルロ法で求めよ'(_pi) :- 'πの値をモンテカルロ法で求めよ'(0,[],L), length(L,_頻度), _pi is _頻度 * 4 / 100000. 'πの値をモンテカルロ法で求めよ'(100000,L,L) :- !. 'πの値をモンテカルロ法で求めよ'(N,L_1,L) :- '点が四分の一円弧の内側の時はカウントする'(L_1,L), N_2 is N + 1, 'πの値をモンテカルロ法で求めよ'(N_2,L_2,L). '点が四分の一円弧の内側の時はカウントする'(L_1,[1|L_1] _x is random(10001) / 10000, _y is random(10001) / 10000, _x ^ 2 + _y ^ 2 >= 1.0,!. '点が四分の一円弧の内側の時はカウントする'(L,L). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(_試行限界数,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- count('_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数), _四分の一円の内部に落ちた数), _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数) :- between(1,_試行限界数,_), '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(0,_試行限界数,0,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- モンテカルロ法により円周率を求める(0,_試行限界数,0,_円周率). モンテカルロ法により円周率を求める(_試行限界数,_試行限界数,_四分の一円の内部に落ちた数,_円周率) :- _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数,!. モンテカルロ法により円周率を求める(N,_試行限界数,S,_円周率) :- '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S2), N2 is N + 1, モンテカルロ法により円周率を求める(N2,_試行限界数,S2,_円周率),!. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S2) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), S2 is S + 1,!. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y.