C言語で抽選を行うプログラムを制作しています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dorian

C言語で抽選を行うプログラムを制作しています。

#1

投稿記事 by dorian » 11年前

先ほどの記事で間違えて解決にしてしまいました。
下のプログラムは最大100人まで抽選で選ぶプログラムの制作しています。
Windows7 Visual C++2010で作っています。
制作を進めてみたところあともうちょっとなんですが、抽選を行うと重複して結果が出てしまうことがあり、重複を出さないようにするためにはどうしたらよいですか?

コード:

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

#define BUFFER_MAX 10000000

void infor(char name[][BUFFER_MAX]){//名簿の中身を表示
	int j;
	for(j=0;j<=99;j++){
		printf("%s,",name[j]);
	}
	printf("\n");
}

void sel(char name[][BUFFER_MAX],int sele){//抽選するための関数
	int a,k;
	int selectbox[50];
		for(a=0;a<50;a++){
		if(strcmp(name[a],"")==0){//nameで配列データがなくなるまでaをカウント
			a=a-1;//aのままではデータがない配列まで差しているので引いておく
			break;
			}
		}
		puts("結果");
	for(k=0;k<sele;k++){//抽選を行う。ここが間違いだと思うが、重複して出てしまうことがあり、重複を出さない方法がわからない
		selectbox[k]=rand()%a;
	printf("%s\n",name[selectbox[k]]);
	}
}


int main(void){
	int count;//登録するごとに人数をカウント
	int i;//名簿の配列リストのカウント
	char select[10];//gets関数を使って数字以外の文字を入力したときにエラーを出すための文字列変数
	int sele;//select変数で数字が入力されたときに格納
	static char name[100][BUFFER_MAX];//名簿:配列ごとに名前の登録
	count=1;
	i=0;

	while(1){
	printf("何人抽選しますか?:");
	gets(select);
	sele=atoi(select);//atoi関数でchar型からint型に変換
	if (1 <= sele && sele <= 50)
	break;
	else
	printf("抽選人数は1~50人でお願いします。\n");//1~50以外の数字、文字を入力したときにエラー
	}
	
	puts("抽選希望の登録を始めます。");
	puts("抽選を開始するなら「抽選」と入力してください");

	while(i<=99){
	printf("%d人目:",count);
    scanf("%s",name[i]);

	if(strcmp(name[i],"抽選")==0&&i-1<sele){//抽選人数<抽選希望人数にするためにエラーを出す
	printf("抽選希望人数は%d人以上でなくてはいけません。\n",sele+1);
	continue;
	}

	if(strcmp(name[i],"抽選")==0){//抽選人数<抽選希望人数のときにsel関数で抽選開始
	sel(name,sele);
	continue;
	}

	if(i==99){//登録した人数が100人に達したとき
	puts("これ以上登録できません。抽選を開始します。");
	sel(name,sele);
	continue;
	}

	infor(name);//人を登録していくと毎にname配列の状態を確認
	i++;
	count++;
	}
	return 0;
}

顔芸

Re: C言語で抽選を行うプログラムを制作しています。

#2

投稿記事 by 顔芸 » 11年前

for(k=0;k<sele;k++){//抽選を行う。ここが間違いだと思うが、重複して出てしまうことがあり、重複を出さない方法がわからない
selectbox[k]=rand()%a;
printf("%s\n",name[selectbox[k]]);
}
簡単な方法としては,selectboxの0番目からa番目の要素をあらかじめ0~aで初期化しておき,
適当な2つの要素(rand() % a番目とrand () % a番目)を入れ替える操作を適当数繰り返し,順番をめちゃくちゃにします.

この後,配列selectboxの先頭からsele個の要素を当選扱いにすればいいと思います.

dorian

Re: C言語で抽選を行うプログラムを制作しています。

#3

投稿記事 by dorian » 11年前

ありがとうございました。とても参考になりました。

閉鎖

“C言語何でも質問掲示板” へ戻る