モンテカルロ法

課題 1 モンテカルロ法による円周率

モンテカルロ法により円周率を求めるプログラムです。

プログラム名 Pai.java

public class Pai {
    public static void main( String[] args ) {
        int max = 10000000;
        int naibu = 0;
        double x,y,r;
        String fmt = "%f %f %8d %8d %18.16f \n";
         
        for ( int i=1 ; max>=i ; i++ ){
            x = Math.random();
            y = Math.random();
            r = x*x + y*y;
            if(1.0>r) naibu++;
            if (i%(max/100) ==0 )System.out.printf( fmt,x,y,naibu,i,(double)naibu/i*4 );
         }
    }//mainの終わり
}//classの終わり

プログラム解説 Pai.java

fmt = "%f %f %8d %8d %18.16f \n"
表示をするときの形式を指定しています。小数点形式2つ、8桁の十進整数2つ、小数以下16桁で全部で18桁の小数形式、最後に改行、という形式です。
Math.random()
乱数をひとつ発生させます。java言語では[0,1) つまり 0以上 1未満のdouble値です。
r = x*x + y*y;
rは中心からの距離の二乗です。これが1.0より小さければ距離も1.0より小さいのでルートを計算しません。
i%(max/100) ==0
1回ずつ表示すると時間がかかるので、max/100回計算するごとにπの値を表示するための計算です。%は割り算の余りを表します。max/100で割り切れるiの時に表示します。

実行結果 Pai.java

実行結果はこうなります。

maxを調整して、点の数が100程度では、3.14まで出ません。しかし、100000程度なら3.14までは出てきます。

さらに10 000 000(一千万)程度では3.1415に近くなるように見えるが、かえって離れていくこともあり、これ以上は多く計算するほど正確になるというものではないようです。

$ javac Pai.java
$ java Pai
0.123718 0.601647    78601   100000 3.1440400000000000 
0.277377 0.103308   157144   200000 3.1428800000000000 
0.705451 0.910908   235585   300000 3.1411333333333333 
0.425548 0.697984   314148   400000 3.1414800000000000 
0.211195 0.665967   392618   500000 3.1409440000000000 
0.498090 0.700432   471065   600000 3.1404333333333330 
0.290351 0.527345   549617   700000 3.1406685714285714 
0.066769 0.869317   628165   800000 3.1408250000000000 
0.687052 0.601850   706498   900000 3.1399911111111110 
0.298080 0.909591   785000  1000000 3.1400000000000000 
0.240153 0.442580   863893  1100000 3.1414290909090910 
0.953242 0.472498   942400  1200000 3.1413333333333333 
0.883238 0.048921  1020877  1300000 3.1411600000000000 
0.388202 0.155567  1099620  1400000 3.1417714285714284 
0.644616 0.866549  1178138  1500000 3.1417013333333332 
0.553633 0.502621  1256704  1600000 3.1417600000000000 
0.647325 0.787430  1335267  1700000 3.1418047058823530 
0.994934 0.003767  1413631  1800000 3.1414022222222220 
0.109126 0.149817  1491940  1900000 3.1409263157894736 
0.852233 0.095405  1570567  2000000 3.1411340000000000 
0.342509 0.738253  1649105  2100000 3.1411523809523810 
0.860381 0.160222  1727758  2200000 3.1413781818181820 
0.754691 0.783570  1806466  2300000 3.1416800000000000 
0.348957 0.527195  1884925  2400000 3.1415416666666665 
0.847615 0.962890  1963385  2500000 3.1414160000000000 
0.242269 0.471590  2041818  2600000 3.1412584615384613 
0.217948 0.399623  2120268  2700000 3.1411377777777780 
0.059348 0.214960  2199041  2800000 3.1414871428571427 
0.557087 0.663467  2277624  2900000 3.1415503448275860 
0.913954 0.925151  2356254  3000000 3.1416720000000000 
0.651155 0.770412  2434756  3100000 3.1416206451612902 
0.514571 0.716295  2513240  3200000 3.1415500000000000 
0.381000 0.182735  2591476  3300000 3.1411830303030300 
0.164413 0.648813  2669929  3400000 3.1410929411764705 
0.722198 0.809002  2748388  3500000 3.1410148571428573 
0.761417 0.729418  2826953  3600000 3.1410588888888890 
0.745051 0.004069  2905259  3700000 3.1408205405405405 
0.798250 0.911108  2983980  3800000 3.1410315789473686 
0.614586 0.569080  3062630  3900000 3.1411589743589743 
0.362303 0.093174  3141131  4000000 3.1411310000000000 
0.590561 0.751470  3219673  4100000 3.1411443902439022 
0.135694 0.121193  3298147  4200000 3.1410923809523807 
0.027455 0.244960  3376905  4300000 3.1413069767441860 
0.395268 0.787032  3455407  4400000 3.1412790909090910 
0.374478 0.189563  3533638  4500000 3.1410115555555556 
0.012598 0.828848  3612208  4600000 3.1410504347826085 
0.175564 0.171579  3690711  4700000 3.1410306382978725 
0.453981 0.931087  3769236  4800000 3.1410300000000000 
0.069374 0.223598  3847916  4900000 3.1411559183673470 
0.780441 0.724482  3926561  5000000 3.1412488000000000 
0.789297 0.824500  4005129  5100000 3.1412776470588235 
0.647730 0.786057  4083637  5200000 3.1412592307692306 
0.163447 0.899452  4162301  5300000 3.1413592452830190 
0.306326 0.639125  4240634  5400000 3.1412103703703704 
0.114666 0.819911  4319450  5500000 3.1414181818181817 
0.601434 0.753288  4397822  5600000 3.1413014285714285 
0.660519 0.403625  4476252  5700000 3.1412294736842106 
0.972983 0.544435  4554655  5800000 3.1411413793103447 
0.913303 0.914627  4633289  5900000 3.1412128813559320 
0.455632 0.374748  4711962  6000000 3.1413080000000000 
0.080038 0.063242  4790451  6100000 3.1412793442622950 
0.678764 0.552694  4868923  6200000 3.1412406451612904 
0.462471 0.006083  4947295  6300000 3.1411396825396825 
0.866490 0.333031  5026010  6400000 3.1412562500000000 
0.457075 0.346054  5104657  6500000 3.1413273846153844 
0.837648 0.916808  5183340  6600000 3.1414181818181817 
0.555052 0.132344  5261856  6700000 3.1414065671641790 
0.005801 0.451358  5340533  6800000 3.1414900000000000 
0.342328 0.860436  5419217  6900000 3.1415750724637683 
0.379239 0.030308  5497629  7000000 3.1415022857142856 
0.499557 0.472098  5576373  7100000 3.1416185915492956 
0.560979 0.693572  5655037  7200000 3.1416872222222220 
0.802120 0.355390  5733612  7300000 3.1417052054794520 
0.748765 0.427353  5812278  7400000 3.1417718918918918 
0.120122 0.344658  5890685  7500000 3.1416986666666666 
0.735067 0.164143  5969290  7600000 3.1417315789473683 
0.418397 0.720540  6047703  7700000 3.1416638961038963 
0.907080 0.782723  6126311  7800000 3.1416979487179490 
0.756505 0.209961  6204968  7900000 3.1417559493670890 
0.246729 0.108164  6283430  8000000 3.1417150000000000 
0.288732 0.986137  6361955  8100000 3.1417061728395064 
0.330663 0.911826  6440436  8200000 3.1416760975609757 
0.264091 0.668571  6518873  8300000 3.1416255421686747 
0.330258 0.911356  6597385  8400000 3.1416119047619047 
0.026322 0.323057  6675997  8500000 3.1416456470588234 
0.011616 0.770693  6754663  8600000 3.1417037209302325 
0.013891 0.461676  6833137  8700000 3.1416721839080460 
0.735568 0.100062  6911591  8800000 3.1416322727272727 
0.759990 0.042800  6990122  8900000 3.1416278651685390 
0.457670 0.455981  7068828  9000000 3.1417013333333332 
0.892539 0.471089  7147474  9100000 3.1417468131868134 
0.728203 0.341252  7225969  9200000 3.1417256521739130 
0.134183 0.597492  7304312  9300000 3.1416395698924733 
0.692176 0.204971  7382814  9400000 3.1416229787234045 
0.302295 0.719248  7461264  9500000 3.1415848421052632 
0.089326 0.442521  7539834  9600000 3.1415975000000000 
0.308974 0.579883  7618335  9700000 3.1415814432989690 
0.254114 0.395572  7696942  9800000 3.1416089795918367 
0.161044 0.369215  7775526  9900000 3.1416266666666670 
0.115730 0.352086  7853983 10000000 3.1415932000000000 

コンピュータの浮動小数点数は有限桁なので不連続な値です。本物の平面は連続な値でてきている(つまりどんなに近い点でも2つの点の間にまだ点を取ることができる)ので正確には表現できないのです。

また、コンピュータの出す乱数の品質の問題もあります。ほんとうにデタラメかという問題です。コンピュータの出す乱数は擬似乱数と呼ばれます。