- ベストアンサー
C言語で乱数の度数分布を調べる方法
- C言語を使用して乱数の度数分布を調べる方法について説明します。
- 乱数の度数分布を調べるために、C言語のrand関数と数学関数を使用します。
- 正規分布に基づいた乱数を生成し、その値の範囲に応じて度数をカウントします。結果は配列に格納され、最終的に表示されます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.1の者です。 配列n[6]の各要素を、事前にゼロで初期化しておいてください。
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6290)
こんな書き方ができるのではないかと思います。 for (i = 0; i < 6; i++) if (i * 0.5 - 1.5 < x && x <= i * 0.5 - 1.0) n[i]++; (注)インデントのため、全角空白を使っています。
- asuncion
- ベストアンサー率33% (2127/6290)
> int j, N, n[6] = { 0 }; のように書くと、定義と初期化が同時にできます。 > srand(3); 実行してみるとわかりますが、srand()の引数が固定の場合、 やはり毎回同じ結果を得ます。 よくあるのは、time()を使って(time.hのインクルードが必要)、 srand((unsigned int) time(NULL)); と書く方法です。 time()の結果はプログラム実行のたびに異なりますので、 毎回異なる乱数を発生させます。 たぶん、こちらの方が少しはおもしろいと思います。 いかがでしょうか。
お礼
たびたび回答ありがとうございます。 >n[6] = { 0 }; なるほど、一括でできてしまうのですね。 ところで、さらに新しい質問となってしまうのですが if文のほうをもっと簡略化する記述はできませんでしょうか?
- asuncion
- ベストアンサー率33% (2127/6290)
No.1とNo.2の者です。たびたび申し訳ありません。 今のコードでは、毎回同じ結果を得ます。 それではあまりおもしろくないと思います。 grand()の実行前に、srand()を使って 乱数を初期化しておいてください。
お礼
回答アリガトウゴザイマス。 こんなかんじでよろしいでしょうか? 結果的には正規分布っぽいかんじになりました。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) double grand(); main(void){ int j, N, n[6]; double x; N=1000; n[0]=0; n[1]=0; n[2]=0; n[3]=0; n[4]=0; n[5]=0; srand(3); for (j = 1; j <= N; j++) { x = grand(); if(-1.5< x && x <= -1.0){n[0] = n[0] + 1;} if(-1.0< x && x <= -0.5){n[1] = n[1] + 1;} if(-0.5< x && x <= 0.0){n[2] = n[2] + 1;} if(0.0< x && x <= 0.5){n[3] = n[3] + 1;} if(0.5< x && x <= 1.0){n[4] = n[4] + 1;} if(1.0< x && x <= 1.5){n[5]= n[5] + 1;} } printf(" %d \n %d \n %d \n %d \n %d \n %d \n", n[0], n[1], n[2], n[3], n[4], n[5]); return 0; } double grand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = RAND(); double U2 = RAND(); V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X; }
- asuncion
- ベストアンサー率33% (2127/6290)
> うまくいきません。 どんな風にうまくいかないかを具体的に書いてください。 それはさておき、main()でのif文の書き方が正しくありません。 > if(-1.5< x <= -1.0){n[0] = n[0] + 1;} こうではなく、 if (-1.5 < x && x <= -1.0) n[0]++; のように、&&演算子を使ってください。
お礼
ありがとうございました! printfのほうにも応用できました。