#include #include #include int main() { int i, j; double x, y ,z; int Num_r = 1000; // 円周率を求めるために乱数を発生させる回数 int Num_t = 10000; // 円周率を求める試行の回数 double pi_c = 0.0; // 球で計算する円周率 double pi_r = 0.0; // 円で計算する円周率 double avg_c = 0.0; // pi_c の円周率からのずれの平均値 double avg_r = 0.0; // pi_r の円周率からのずれの平均値 for( j = 0; j < Num_t; j++ ){ // 1回の試行ごとに円周率を初期化 pi_c = 0.0; pi_r = 0.0; for( i = 0; i < Num_r; i++ ){ // 乱数の取得(球で計算) x = rand() / (double)RAND_MAX; y = rand() / (double)RAND_MAX; z = rand() / (double)RAND_MAX; // 距離が1以下なら球の内部 = 球の体積の構成要素なので、1足す if( x*x+y*y+z*z <= 1.0 ){ pi_c += 1.0; } // 乱数の取得(円で計算) x = rand() / (double)RAND_MAX; y = rand() / (double)RAND_MAX; // 距離が1以下なら円の内部 = 円の面積の構成要素なので、1足す if( x*x+y*y <= 1.0 ){ pi_r += 1.0; } } // 円周率の計算 pi_c = 6.0 * pi_c / (double)Num_r; pi_r = 4.0 * pi_r / (double)Num_r; // 1回の試行ごとに計算した円周率を表示 printf("球:%lf\t円:%lf\n", pi_c, pi_r); // 求めた円周率のずれの絶対値を足す(fabs 関数:与えた引数(実数型)の絶対値を返す, M_PI:円周率の近似値) avg_c += fabs(M_PI - pi_c); avg_r += fabs(M_PI - pi_r); } // 円周率からのずれの平均値を計算 avg_c = avg_c / (double)Num_t; avg_r = avg_r / (double)Num_t; printf("\n球:%lf\t円:%lf\n", avg_c, avg_r); return 0; }