ページ 11

C言語実行時のエラーについて

Posted: 2012年6月22日(金) 22:30
by 乱数ちゃん
C言語で重複なしの乱数を生成するためのプログラムを組んだのですが、エラーが出てうまく実行してくれません。
「問題が発生したため、test.exe を終了します。 ご不便をおかけして申し訳ありません。」だなんて云うんですよ・・・

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* プロトタイプ宣言 */
int  GetRand(int Num);							/* 0~Numまでの乱数生成 */
void ChangeNumber( int *a, int *b );			/* aとb入れ替え */
void NoOverlapRand(int min, int max, int *val);	/* min~maxまで重複なし乱数を配列*valに格納 */


int main(){

	int Random[20];	/* 重複なし乱数用配列 */
	int j;			/* カウンタ */

	srand( (unsigned)time(NULL) );	/* 乱数初期化 */

	NoOverlapRand( 0, 9, Random );	/* 0~9までの重複なし乱数をRandomへ */

	for( j=0; j<10; j++ )
		printf( "ランダムな値%dは「%d」を出力!\n", j+1, Random[j] );					

	return 0;
}

/* 0~Num-1までの乱数生成 */
int GetRand( int Num ){
	return rand()%Num;
}


/* 重複なし乱数の生成 */
void NoOverlapRand(int min,int max,int *val){

	int i=0,t,n;

	for(t=min; t<=max; t++){
		val[i]=t;			/* val[i]にtを入れていく。 */
		i++;
	}

	for(n=max-min; n>=0; n--)
		ChangeNumber( &val[ GetRand( n ) ], &val[n] );	/* 配列を一つランダムで指定し、配列一番最後の数と交換 */

}

/* AとBの中身を入れ替える */
void ChangeNumber(int *a, int *b){
	int  r=*a;
		*a=*b;
		*b= r;
}
完璧だと思ったのですが・・・何がいけないのかご指摘お願いします。
C言語は色々なサイトで学びました。それなりには理解しているつもり・・・です。
まぁ理解してないから質問してしまう状況になるんですけどorz

Re: C言語実行時のエラーについて

Posted: 2012年6月22日(金) 22:32
by みけCAT
GetRand関数のNumに0を渡した場合、ゼロ除算で強制終了してしまいます。

Re: C言語実行時のエラーについて

Posted: 2012年6月22日(金) 22:41
by 乱数ちゃん
うわぁ・・・恥ずかしい
こんなミスなんかでトピックを建ててしまい申し訳ないですorz

rand()%(Num+1);とすることで解決しました、みけCAT様本当にありがとうございました