- 締切済み
グループ分け
シャッフルした配列の先頭から順番に各グループに割り当てていくプログラムを教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
cater さん、こんにちは。 一例として、トランプの全カード(ジョーカーを含めた53枚)をシャッフルして、適当な人数(2人以上) に振り分けるプログラムとして、その考え方のみを上げてみました。 ■シャッフルカード分配のサンプルプログラム例 1)カード全体用の配列(カード配列)を用意する。 ・1枚のカードを数値とみなして整数配列とする。 例) int nCard[52+1]; 2)カード配列に初期値をセットする。 ・カード配列に順番に数値(カードを数値に置き換えたもの)をセットする。 例)以下のようにカードを数値に置き換えて、カード配列( nCard[0]~[52] )にセットする。 ・カード ( A, 2~10, J, Q, K ) → 1~13 ・スペード → 100番台 ・クローバー → 200番台 ・ハート → 300番台 ・ダイヤ → 400番台 ・ジョーカー → 999番 ・103番なら、「スペードの3」を表す。 ・211番なら、「クローバーのJ(Jack)」を表す。 ・301番なら、「ハートのA」を表す。 として3桁の数字の組合わせでカードを表し、カード配列にセットする。 ・nCard[0] ~[12] = 101~113 ・nCard[13]~[25] = 201~213 ・nCard[26]~[38] = 301~313 ・nCard[39]~[51] = 401~413 ・nCard[52] = 999 3)カード配列をシャッフルする。 ・乱数を使用し、カード配列( nCard[0]~[52] )の中身を入れ替える。 例)以下の操作を行う。(※カード全てを入れ替える場合) (1) ループ上限値( n=53 )、ループ変数( i )とし、 for文: for( i=1; i<n; i++ ) で以下 (2)、(3) の処理を繰り返す。 (2) 乱数関数を使用し、( i ~ n-1 ) の間の乱数値( a )を決定。 (3) nCard[i-1] と nCard[a] を入れ替える。 4)カードを配る。 ・適当な人数分の持ち札配列を用意し、カード配列の先頭から順番に振り分ける。 例)4人の場合 (1) 持ち札配列( int nMbCard[4][53/4+1]; )を用意する。 (2) 2重ループなどを使用し、nMbCard[x][y] に nCard[0]~[52] の値をセットする。 ・x = 0~3 ・y = 0~(53/4) 以上です。少しでも参考にして頂ければ幸いです。 なお、具体的なコードについては、cater さんがやり易い方法でお考えになられた方が良いと 思いますので、ここでは示せません。(御免なさい) また、cater さんが書かれたコード(一部でも構いません)を示された上でのご質問であれば、 ある程度、具体的なコードを用いたアドバイスができるかも知れません。 ※ご健闘をお祈り致します。
- yaemon_2006
- ベストアンサー率22% (50/220)
どのような配列を、どのような順番で、どのようなグループに、どのように割り当てるのか、 書きましょう。