ページ 11

C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月19日(金) 07:59
by YYY
サイコロのプログラムをつかってやろうと思いましたがなんだか乱数をうまく利用できていない気がしました。
かぶりなく、公平に(ランダムに)チーム分け出来るプログラムを教えてください。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月19日(金) 08:37
by non
YYY さんが書きました:乱数をうまく利用できていない気がしました。
うまくいかないプログラムを載せてください。そして、そう思った理由を述べてください。
あまりにも、状況が不明でお答えしようがありません。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 08:38
by みけCAT
「n人をmチームに分ける」のルールをもう少し詳しく教えてください。
mチームの人数はできるだけ均等でないといけませんか?それとも各チーム1人以上いれば何人でもいいですか?
など

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 09:19
by YYY
non>#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int saikoro(int n) {

return (int) (n * (rand()/32767.1)) + 1;

}

int main(void) {

int i;

srand((unsigned) time(NULL));

for (i = 1; i <= 100; i++)
printf("%4d", saikoro(6));

return 0;

}

サイコロのやつです。ここから、チーム分け、かぶりなしの数値を取り出す、という感じにしたいです。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 09:23
by YYY
みけCAT>例えば、10人を3チーム分けるとなりますと、4:3:3、3:3:4、3:4:3のようにしなきゃいけないようです。余る人がいない場合は均等にチーム分けをする。こんな感じのプログラムになります。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 09:42
by non
サイコロでの乱数の発生としてはこれで問題はないと思います。
RAND_MAXが32767という前提で。

それで、あなたはサイコロを使ってどのようにチーム分けしたいのですか。
プログラムとして、考えられなくても、実際だったらどうするのか、示してください。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 09:50
by non
YYY さんが書きました:4:3:3、3:3:4、3:4:3のようにしなきゃいけないようです。
ということは、人から与えられた課題ということですね。それであれば、課題を正確に書いてください。
実行例(何を入力して、どう出力するのか)も示してください。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 10:15
by みけCAT
人を表す1~Nまでの整数をシャッフルして、最初から均等にチームの番号を割り振っていけばいいと思います。
もしくは均等に用意したチームの番号をシャッフルしてもいいです。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 10:18
by YYY
non>与えられた課題は、乱数を用いて公平なチーム分けを行うプログラムを作成してください。
ex:人数・・・42 チーム・・・5
1:2 6 12 22 25 30 38 39
2:4 7 16 17 21 23 24 27 33
3:5 9 13 29 32 35 40 41
4:8 10 14 20 28 31 34 36 42
5:1 3 11 15 18 19 26 37



このようなヒントはいただけました
私はサイコロの目を人数にするという感じでつくろうかと思いました。もっと簡単に作れると思いますがいい案がありませんでした。
上記で示したプログラムではサイコロ同様の動きをしますが、このままだと表示される数にかぶりが現れてしまうことになり、混乱していました。
プログラミングは初心者なのですみません。

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 10:20
by YYY
みけCAT>ありがとうございます!シャッフルはどのような構造になりますか?

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 10:23
by みけCAT
擬似コードで示します。

コード:

シャッフル(配列)
 for i=配列のサイズ,配列のサイズ-1, ... , 1 // 1-origin
  pos= [1,i]の整数の乱数
  配列のi番目とpos番目を交換
 next i
シャッフルおわり

Re: C言語で乱数を用いてn人をmチームに分ける

Posted: 2013年7月20日(土) 10:29
by YYY
みけCAT>参考にさせていただきます!