リハビリ
Javaでモンテカルロのプログラムができてしまったのでリハビリ程度にCでも実装。
相変わらずscanfの引数とかrandの使い方とか微妙なところを忘れてるなぁ。バグ探すのが大変。Javaで実装するよりはだいぶ早い気がする。
こっちは出さないのでオープンソースにしてしまおう。
コピペしてばれないくらいまでリファクタリングできる人は最初からは書いたほうが早いと思うので(ぉ
可読性とかコメントくれる人募集。空白行は実際より減らしてあります。
/*************************************** * モンテカルロ法により半径290の円の面積を求めるプログラム * Ver1.0 * by 悠太@天球 ***************************************/ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define RADIUS (29 * 10) #define DIAMETER (RADIUS * 2) #define PI 3.14159265358979 void init(int *dots); double calc(int dots); double distance(int x,int y); double myrand(void); int main(void){ int dots; double x,y; while(1){ init(&dots); if(dots<=0){ break; } printf("計算値 : %f\n",RADIUS*RADIUS*PI); printf("結果 : %f\n",(double)(DIAMETER*DIAMETER) * (calc(dots) / (double)dots)); } puts("=====終了====="); return EXIT_SUCCESS; } /*************************** * プロットする点の数の入力と ***************************/ void init(int *dots){ char temp[20]; srand((unsigned)time(NULL)); puts("点の数を入力してください(非正整数の入力で終了)"); scanf("%s",temp); *dots = atoi(temp); return; } /*************************** * 乱数で生成された座標のうち * 円の内部に入った点の数を返す ***************************/ double calc(int dots){ int i; double x,y; int circle = 0; for(i=0;i<dots;i++){ x = myrand(); y = myrand(); if(distance(x,y)<RADIUS){ circle++; } } return (double)circle; } /*************************** * 原点から引数の座標までの距離を返す ***************************/ double distance(int x,int y){ return sqrt((double)(x*x + y*y)); } /*************************** * RARIUS未満の実数の乱数を返す ***************************/ double myrand(void){ return (double)rand() / RAND_MAX * RADIUS; }