• ベストアンサー

乱数について

乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.2

問題点: ・配列Sの中身が0で初期化されていない memsetなどで初期化してください。 ・配列外アクセス for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } これだと、S[RAND_MAX]にアクセスしてしまいます。 条件をi<RAND_MAXにしましょう。 ・imaxが大きすぎる S周りでスタックエラーを引き起こします。10000位にしてください。

batebate
質問者

お礼

回答ありがとうございます! おかげさまで解決しました。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

S[]を初期化していないので変な値が入ってるだけでは。

batebate
質問者

お礼

回答ありがとうございます!

関連するQ&A