1#include<stdio.h>2#include<math.h>3#include<stdlib.h>4#include<time.h>5#definepi3.1415926intmain(void){7int m =1000;8int i,j,k,num =0;9srand((unsignedint)time(NULL));10int randam[5][1000]={0};11for(i =0; i <5; i++){12for(j =0; j < m; j++){13 randam[i][j]=rand();14}15}1617for(i =0; i <5; i++){18for(j =0; j < m ; j++){19double x,y;2021 x =(float)randam[i][j]/ RAND_MAX;//0~1の範囲の小数点乱数22 y = x +sin(((float)randam[i][m-j])*2* pi);2324if(y <=0||1<= y){25 num++;26}2728//printf("%lf %lf\n",x,y);29}30printf("result%d :%e\n",i+1,(double)num/m);31}32return0;33}34
確かに
y = x + sin( ((float)randam[i][m-j])/RAND_MAX* 2 * pi * pi/180);
とすれば、
result1 :5.600000e-02
result2 :1.050000e-01
result3 :1.580000e-01
result4 :2.120000e-01
result5 :2.650000e-01
似たようなオーダーになりますね
0
ベストアンサー
気になったところ
配列は必要ありません。冗長です。0-1の値さえ出てくればいいので関数を作りました。
棒の長さなどが与えられていないです。(こちらで陽に与えました)
math.hをインクルードしているのであれば、円周率は自分で定義せずM_PIを使いましょう。
答えの分数は逆数にしなければなりません。
numは試行するたびに0に初期化しなければなりません。
コード
C
1#define_USE_MATH_DEFINES2#include<math.h>3#include<stdio.h>4#include<stdlib.h>5#include<time.h>6// 0から1の一様分布に従う乱数を返す7doublecalculateUniformRandom()8{9returnrand()/(double)(RAND_MAX +1.0);10}1112intmain(void)13{14// 棒の長さ15constdouble l =1.0;16// 平行線の距離17constdouble d =2* l;18// 試行回数19constint m =1000;2021srand((unsignedint)time(NULL));2223for(int i =0; i <5; i++){24int num =0;25for(int j =0; j < m; j++){26double x =calculateUniformRandom()*0.5* d;// [0:d/2]の乱数27double y = l *0.5*sin(calculateUniformRandom()* M_PI *0.5);2829if(x - y <=0|| x + y >= d){30 num++;31}32}33printf("result%d :%lf\n", i +1, m /(double)num);34}35return0;36}37
1#define_USE_MATH_DEFINES2#include<math.h>3#include<stdio.h>4#include<stdlib.h>5#include<time.h>67// [min, max]の範囲の一様分布に従う乱数を返す8doublecalculateUniformRandom(double min,double max)9{10return min +(double)(rand()*(max - min +1.0)/(1.0+ RAND_MAX));11}1213// 円周率を使用せず大きさrのベクトルを計算する(一様分布)14voidcalculeteUniformRandomVectorNoPI(double* x,double* y,double r)15{16double xtemp, ytemp, rtemp2;1718// 正方形の中から, 半径1の円内部の座標を得るまで繰り返す。19do{20 xtemp =calculateUniformRandom(0,1.0), ytemp =calculateUniformRandom(0,1.0);21 rtemp2 = xtemp * xtemp + ytemp * ytemp;22}while(rtemp2 >1.0);2324// 正規化し, 大きさrにする。25double rtemp =sqrt(rtemp2);26*x = xtemp / rtemp * r;27*y = xtemp / rtemp * r;28}2930// 円周率を使用して大きさrのベクトルを計算(一様分布)31voidcalculeteUniformRandomVectorPI(double* x,double* y,double r)32{33double theta = M_PI *0.5*calculateUniformRandom(0,1.0);34*x = r *cos(theta);35*y = r *sin(theta);36}3738doublecalculatePi(int tryNumber,double l)39{40int num =0;41double d = l *2;4243for(int i =0; i < tryNumber; i++){44double centerY =calculateUniformRandom(0, d *0.5);45double directionX, directionY;4647calculeteUniformRandomVectorNoPI(&directionX,&directionY, l *0.5);48if(centerY - directionY <=0.0|| centerY + directionY >= d)49 num++;50}5152return tryNumber /(double)num;53}5455intmain(void)56{57srand((unsignedint)time(NULL));5859for(int i =0; i <5; i++){60printf("result%d :%lf\n", i +1,calculatePi(1000,1.0));61}62return0;63}64
追記(最小限の修正)
ご質問のコードだと、平行線の間隔が1, 棒の長さが0.5になりますね。
C
1#include<math.h>2#include<stdio.h>3#include<stdlib.h>4#include<time.h>5#definepi3.1415926intmain(void)7{8int m =1000;9int i, j;10srand((unsignedint)time(NULL));11int randam[5][1000]={0};12for(i =0; i <5; i++){13for(j =0; j < m; j++){14 randam[i][j]=rand();15}16}1718for(i =0; i <5; i++){19int num =0;20for(j =0; j < m; j++){21double x, y;22 x =(float)randam[i][j]/(RAND_MAX +1.0);//0~1の範囲の小数点乱数23 y = x +0.5*sin(((float)randam[i][m - j])/(RAND_MAX +1.0)*2* pi);2425if(y <=0||1<= y){26 num++;27}28}29printf("result%d :%e\n", i +1, m /(double)num);30}31return0;32}