Lying Devils

日々いろんなことを呟いていく。そんな感じ?

【C言語】for文について【解決済み】

前書き

 初めてMarkdownでブログを書きます。でも、Githubを使ってる人間だったら普通に使えないといけないと思うのでこれを機にしっかり勉強したいと思いました。

 ちなみに今回も学校課題のものです。

本題

 学校課題でモンテカルロ法のプログラムを作ってみろと言われたので、四分円の面積内に点が打たれる確率から円周率を求めてみればいいのではないかと思ってとりあえずそれをやろうとしました。

 どうせレポートをその後に書くので、レポートに書きやすい様に試行回数を10倍ずつ変化させて出力すればいいかな、と思ってやってみたんですよ。

 初めはif文であらかじめ設定した値になるまで試行をさせたらいいのかなと思ったんですが、せっかくだし収束幅が幾らぐらいになったら止める様にすれば、どれぐらいにすれば適切な精度で出せるかが判ると思ったのでやってみたんです。

 コードはここです↓

github.com

 結果がこれです

start
1
set
calc ave
start plc_xy
0
calc place_x
calc place_y
calc place ave
start r_clc
1.000000
start plc_xy
0
calc place_x
calc place_y
calc place ave
start r_clc
2.000000
start plc_xy
0
calc place_x
calc place_y
calc place ave
start r_clc
3.000000
start plc_xy
0
calc place_x
calc place_y
calc place ave
start r_clc
3.000000

 率直に言って泣きました。

問題

 今回問題となるのはコードの中でもここの部分だと思うんですよね。

int r_calc(double place_x, double place_y){
 puts("start r_clc");
 if(sqrt(pow(place_x,2) + pow(place_y,2)) <= 100){
    return 1;
 }else{
    return 0;
 }
}

 double plc_xy(int N){

     double place_x,place_y,X;

     puts("start plc_xy");
     for(int i = 0; i < N; i++){   //   ここ
    printf("%d\n",i);
    puts("calc place_x");
        place_x = rand() % 101;
    puts("calc place_y");
    place_y = rand() % 101;
    puts("calc place ave");
    X += r_calc(place_x, place_y);
    printf("%f\n",X);
 }

(こうやって見ると自分のインデントがたがたですね…)

 ともかくも、この部分で正しくi++処理されてないのが原因っぽいです。

 iの定義を外に出したりいろいろしていますが、どうにもうまくいきません。

 何となく気になってNの入力が失敗してるんじゃないかとか考えてみてログを確認したらこんなんになってました(若干コードは変えました)。*1

start
1
set
calc ave
start plc_xy
N = 1
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc
calc ave 1.000000
start plc_xy
N = 1
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc
calc ave 1.000000
start plc_xy
N = 1
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc
calc ave 2.000000
start plc_xy
N = 1
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc
calc ave 3.000000
start plc_xy
N = 1
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc
calc ave 4.000000
start plc_xy
N = 1076887552
calc plc 0
calc place_x
calc place_y
calc place ave
start r_clc

 ええ…


現状

 色々何が起きてるのかさっぱりわからないのでとりあえずここに愚痴っておきます。

 どうしようもなければどこかに質問でも投げておかないとなあと思いました。

 以上です。ノシ


 puts("start plc_xy");
 printf("N = %d\n",N);                                        
 for(i = 0; i < N; i++){   
    printf("calc plc %d\n",i);                              
    puts("calc place_x");                                
    place_x = rand() % 101;                          
    puts("calc place_y");                         
    place_y = rand() % 101;                   
    puts("calc place ave");               
    X += r_calc(place_x, place_y);   
    printf("calc ave %f\n",X);   
}

追記(2021/1/23)

 すごく単純な問題でした。

 Githubの履歴を見て頂ければわかりますが、単純にプログラムミスでした。

 配列の定義がおかしくなってます。

 はい。

 泣きたくなりました。

 みなさんもしっかり配列の初期化には注意しましょうね。

 (´;ω;`)ノシ

*1:Nが見られるようになってます