モンテカルロ法により円周率を求めるプログラムです。
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の終わり
実行結果はこうなります。
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つの点の間にまだ点を取ることができる)ので正確には表現できないのです。
また、コンピュータの出す乱数の品質の問題もあります。ほんとうにデタラメかという問題です。コンピュータの出す乱数は擬似乱数と呼ばれます。