P129 モンテカルロ シミュレーション 乱数を使ったシミュレーション
モンテ・カルロ モナコ公国の北部を占める地区。 南の首都モナコ市とは港を挟んで反対側(北)に位置する。 1856年シャルル3世が公国の財源確保のため賭博(とばく)場(カジノ)の開設を許可、1861年に開設して以来、カンヌ、ニースと並び、地中海のコート・ダジュール有数の観光・保養地、海水浴場として発達した。
モンテ・カルロ
C言語での乱数発生 rand( ) 0 ~ RAND_MAX までの ランダムな整数値が発生する。 (32767) #include<stdlib.h> を使用
プログラム例 #include <stdio.h> #include <stdlib.h> int main() { int irandx, i, n=4; for(i=0;i<n;i++){ irandx = rand(); printf("%d\n",irandx); } return 0;
0~1の乱数の発生 0~1の実数を与えるには、 rand( )を最大値RAND_MAXで割る。 例: randx = (double) rand()/(double) RAND_MAX;
プログラム例 #include <stdio.h> #include <stdlib.h> int main() { int i, n=4; double randx; for(i=0;i<n;i++){ randx = (double)rand()/(double)RAND_MAX; printf("%lf\n",randx); } return 0;
円の面積=(円内の個数)/(全部の個数) 0.5 - 0.5 0.5 円の面積=(円内の個数)/(全部の個数) - 0.5
円の面積 0.5 (x1, x2) - 0.5 0.5 円内の条件 ⇒ (x12 + x22 )<0.25 - 0.5
球の体積 (x1, x2, x3) 球内の条件 ⇒ (x12 + x22 + x32 )<0.25
多次元空間の球内の条件 三次元 x12 + x22 + x32 < 0.25 四次元 x12 + x22 + x32 + x42 < 0.25 五次元 x12 + x22 + x32 + x42 + x52 < 0.25 ただし,‐0.5 < x1, x2, x3, x4, x5 < 0.5
多次元空間の球の体積 m[j]=0 乱数で,x1, x2, x3, …を生成 m[j]=m[j]+1 No Yes 繰り返し数:N 体積=m[j]/N
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 10000 #define DIM 5 int main( ) { double x[DIM], r[DIM]; int n, j; double rr; int m[DIM+1]; for(j=0;j<DIM;j++) m[j]=0; 乱数の点数 5次元まで 球内の個数を カウントする変数
乱数発生 0~1 各次元ごと 距離を計算 各次元ごと 球内点を加算 全点数で割って 球体積を計算」 printf(" 回数 円面積 球体積 四次元 五次元\n\n"); for(n=1;n<=N;n++){ for(j=0;j<DIM;j++){ x[j]=(double)rand()/32768.; r[j]=0.0; } rr=0.0; rr+=(x[j]-0.5)*(x[j]-0.5); r[j]=rr; for(j=0;j<DIM;j++) if(r[j]<0.25) m[j]++; if((n%1000)==0){ printf("%6d ",n); for(j=1;j<DIM;j++) printf("%9.4lf ",(double)m[j]/(double)n); printf("\n"); return 0; 乱数発生 0~1 各次元ごと 距離を計算 各次元ごと 球内点を加算 全点数で割って 球体積を計算」
乱数の初期値を変更する srand((unsigned)time(NULL)); をrand()の前に入れる。 #include<time.h>; を使用
プログラム例 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, n=4; double randx; srand((unsigned)time(NULL)); for(i=0;i<n;i++){ randx = (double)rand()/(double)RAND_MAX; printf("%lf\n",randx); } return 0;
例題 15分間隔でくるバスの待つ時間の平均? 待つ時間:0~15分 0 15 30 45
15分間隔のバスを待つ時間 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, n=100; double randx=0.0; srand((unsigned)time(NULL)); for(i=0;i<n;i++) randx += 15* (double)rand()/(double)RAND_MAX; randx=randx/(double)n; printf(“%lf\n",randx); return 0; }
15分間隔のバス 10分以上待つ確率を求めるプログラムを書け。 学部コード;25 時間割コード;63270 曜日・時限:木2