プロが教えるわが家の防犯対策術!

課題で、全部で8名から代表者を3名無作為に選びたい。一様乱数を0から7の間で発生させる。それを100回試行して最も回数の多い順に並べ変えを行って表示すると言う、プログラムを作りたいのですがどうすればいいですか?
第1位 ○○回 △さん
第2位 ○○回 △さん
第3位 ○○回 △さん
と言う風に表示したいです。

A 回答 (1件)

以下のようにしてください。

不明点は補足にて質問してください。
乱数は現在時刻を種として設定しています。(でないと毎回同じ乱数が出現するので)
名前は1文字でなく、10文字まで使用できるようにしました。(%10sの書式を尊重しました)
---------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
main()
{
unsigned char x;
int w,n,i,j;
int count[8];
int skipFlag[8];
char name[8][11]={"AAA","BBB","CCC","DDD","EEE","FFF","GGG","HHH"};
int rank[8];
int maxcount;
int maxindex;
for(n=0;n<8;n++)
{
count[n]=0;
skipFlag[n]=0;
}
srand(time(NULL)); //乱数の種を与える(種は現在時刻)
for(i=1;i<=100;i++)
{
x=rand()%8;
count[x]++;
}
//countの中から最大の値をもつ位置(添え字)を探す
//それを8回繰り返す(1位から8位まで探す)
for(i=0;i<8;i++)
{
maxcount = -1; //最大値に-1を設定(初期値)
for(j=0;j<8;j++)
{
if (skipFlag[j] == 1) continue; //既に最大になった箇所はスキップ
if (count[j] > maxcount){
maxcount = count[j]; //最大値を更新
maxindex = j; //最大値の添え字を記憶
}
}
//最後に最も大きい値の添え字が記憶されているのでそれを格納
rank[i] = maxindex;
//最大になった箇所は、次回使用しないようにするため1をセット
skipFlag[maxindex] = 1;
}
printf("----------------------\n");
for(i=0;i<8;i++)
{
w = rank[i];
printf("第%d位%3d回%10s\n",i+1,count[w],name[w]);
}
printf("----------------------\n");
}
---------------------------------------
以下、実行結果です。
1回目
----------------------
第1位 18回 AAA
第2位 16回 FFF
第3位 13回 BBB
第4位 13回 EEE
第5位 11回 DDD
第6位 10回 CCC
第7位 10回 GGG
第8位 9回 HHH
----------------------

2回目
----------------------
第1位 18回 FFF
第2位 13回 AAA
第3位 13回 BBB
第4位 12回 CCC
第5位 12回 GGG
第6位 11回 EEE
第7位 11回 HHH
第8位 10回 DDD
----------------------
    • good
    • 2
この回答へのお礼

助かります、有難う御座います。

お礼日時:2015/05/22 22:54

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