乱数の分布を見るために以下のようなプログラムを書きました。

#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を
超えるくらいのところでおかしな値になりました。
原因がわからないのでどなたか教えてください。

A 回答 (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位にしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/15 23:27

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/15 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング