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

12名で年6回ゴルフコンペを行っております。
4名1組で計3組でラウンドしておりますが
この6回の内に他の11名すべての人と
なるべく重複しないように組を組むには
どういった組み合わせ方をすれば
良いでしょうか?
宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

 「みんなに一度は当たる」というだけの条件だったら、高々5回のラウンドでできちゃうんです。



 まず、条件を追加して、手作業で扱える程度の問題に帰着してしまいます。どんな条件かと言うと:
 12人のメンバーを1さんから12さん、と呼ぶことにします。(いや、●chとは関係ないです。)
で、二人ずつペアになって貰います。
ペア1は1さんと7さん、ペア2は2さんと8さん、ペアnはnさんとn+6さん(n=1~6)
こうして決めたペアはいつも一緒の組になる。これが追加した条件です。
 そうすると、
ラウンド1ではペア1~6はそれぞれA組,A組,B組,B組,C組,C組
ラウンド2ではペア1~6はそれぞれA組,B組,A組,C組,B組,C組
ラウンド3ではペア1~6はそれぞれA組,B組,C組,A組,C組,B組
ラウンド4ではペア1~6はそれぞれA組,B組,C組,B組,A組,C組
ラウンド5ではペア1~6はそれぞれA組,B組,B組,C組,C組,A組
という解がすぐ見つかりました。
 どのペアも他の5つのペアと一度は一緒にラウンドしてます。ですから、どの人も他の人全員と一度はラウンドしたことになる。だからこれで、「みんなに一度は当たる」という条件を満たしています。

 ただ、この組み合わせ方では、どの人もペアを組んだ相手とはいつも一緒である。これをもっと散らして平準化したいですね。

 そこで1~6さんは上記の組み合わせに従って戴くとして、7~12さんには以下のように組を代わって貰います。
ラウンド2と3ではA組と言われたらB組へ、B組と言われたらC組へ、C組と言われたらA組へ行く。
ラウンド4と5ではA組と言われたらC組へ、B組と言われたらA組へ、C組と言われたらB組へ行く。
 こうしますと、5回のラウンドのうちで、どの人も他の全員と当たり、しかも高々3回しか同じ人と当たりません。
 3回当たるのは
(1,8),(2,7),(3,10),(4,9),(5,12),(6,11)
 2回当たるのは
(1,9),(1,10),(2,9),(2,10),
(3,11),(3,12),(4,11),(4,12),
(5,7),(5,8),(6,7),(6,8)
で、他の「二人の組み合わせ」は1回ずつ当たります。

 ところで、6回のラウンドを有効に使えばもっと平準化できる(同じ人と1回しか当たらないということを減らすとともに、同じ人に3回当たるという組み合わせを少なくできる)に違いなく、コンピュータで力任せに探索すればナントカなるはず。そのうちやってみるかも知れません。
    • good
    • 1
この回答へのお礼

詳しい例をあげて頂きありがとうございます。
2回続けて同じ人とラウンドすることは
実際多々ありましたので組合せ的に避けられないことだと
思っていました。
今回このパターンに当てはめて組合せ表を
作ってみたところ3回当たる(2.7)の人だけ
連続3回一緒にラウンドすることになりますが
これはラウンド2を最後に回すことで
回避出来ますよね?
お忙しいところありがとうございます。

お礼日時:2003/12/07 21:23

odenon909さん、今晩は。

#1のものです。この週末に
家でプログラムを作って結果を出そうとしたら土日とも
休日出勤と相成ってしまいました。(泣)
さて、私もstomachmanさんの条件(1')(2)(3)を充たすものを探そうとしています。

(1') 任意の対は高々3回しか実現しない。
(3) 任意の対が少なくとも一回は実現される。
(2) 3人の組合せは高々一回しか実現しない。

で、プログラミングの方針として次の二つのものを立てました。
この方針に則ってプログラムを作ってくれる奇特な人はいないかな。
ただ、組み合わせ論に慣れた人でないと結構大変だろうけど。
勿論時間ができれば、私が作ります。(締め切られていない場合ですが)

方針1 強引な方法
ラウンドとは12人を4人からなる3つの集合に分割したもの。
(以降は、便宜上10番目、11番目、12番目の人を夫々A,B,Cで表わす)
従って、その全体(以下ROUNDとする)はC(11,3)C(7,3)=5775通り。
第1ラウンドは次のように決めて良い。
R1:[1234][5678][9ABC]
従って、2~6ラウンドをどう決めるかが問題。

1 12人中の3人の組合せは全部でC(12,3)=220通りだが、R1で12通りの
3人組みが既に実現されている。この12通りの集合をAとする。

2 12人中の4人の組合せは全部でC(12,4)=495通りだが、R1の4つと
集合Aを含む4人組みを全て取り除く。得られた集合をXとする。

3 ROUNDからXの要素に含まれない4人組みを含むラウンドを取り除く。
得られた集合をYとする。

ここでかなりのギャップ。

4 Yの要素の5個の組で同じ3人組を含まないものを全て求める。

5 4で得たものの中で、条件(2)(3)を充たすものを取出す。

方針2(組合せ理論のある定理を使った方法)はまた明日にでも
書き込みます。但し、その定理が有効かどうかはまだ見えていません。
単なる使ってみたいだけと言う事もあります。
    • good
    • 0

 そうスッキリとは行きそうにない問題で、すぐには検討できないんで、とりあえずチョコチョコとプログラムを書いて走らせてみました。

No.1の回答と似たような発想で、
(1) 誰も、同じ人とは高々2回しか同じ組にならない。
という条件を付け、さらに、
(2) ある組において、3人以上が以前のコンペで同じ組だった、ということはない。
を条件としてみました。
 で、結果ですけれど、この二つの条件を付けたとき、5回はコンペができますが、6回やる方法はどうもないみたいです。(勿論、プログラムのチョンボの可能性もありますが。)

 ですから、条件を緩めなくてはいけません。どう緩めましょうか。まずは
(1') 誰も、同じ人とは高々3回しか同じ組にならない。
としましょう。それから、実際問題としてはおそらく
(3)どの二人をとっても、6回のコンペのうち少なくとも一度は一緒の組になる。
が重要ではないでしょうか。せっかくのコンペですもんね。だから今度は、(1')(2)(3)の三つを条件にしてみようかと思います。ただ、この条件では計算時間も格段に増えると予想され、コンピュータで探索するのもいつになるやら…
    • good
    • 1
この回答へのお礼

皆様お忙しいところ回答下さいましてありがとうございます。 感謝しております。
自分が幹事をしているので旨く年を通して
皆とあたるようにずっと考えていたんですが
どうしても2人は続けて重なってしまうのですね。
これが4組だと簡単かな?
同じ人と続けてあたるのは良しとして
うまく組を作る方法などありますでしょうか?
たとえば乱数表のようなもので、、、。
お暇な時で結構ですのでお知恵を拝借させてください
宜しくお願い致します。

お礼日時:2003/12/03 21:56

なるべく重複しないようにというのは、


例えば、

Aさんの組には毎回のように
一緒にラウンドした人がいるが
他の人はあまり重複していない

というのと、

みんな平等に重複している

のとでは、どちらがなるべく重複してないのですか?
    • good
    • 0

odenon909さん、今晩は。


御質問は方針を求めているのでしょうか、それとも
具体的な回答を求めているのでしょうか。後者のような気がしますが、それは簡単には行かないので、まずは方針だけ。

12人ですから対は全部でC(12,2)=66個あります。また、一ラウンドで4人一組ですから、一組が
含む対はC(4,2)=6個、それが3組ですから
一ラウンドは18個の対、年6回で108個の対となります。
少なくとも108-66=42個の対が重複しますから、1回だけ実現される対が24個、2回実現される対が42個となるようなものが選べれば多分それがご希望の組合せでしょうね。

p.s. 私は趣味で似たような幾何学的問題を考えています。そちらの理論が応用できそうな気がするのでさらに
考えてみます。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q8人を4人の2グループに分ける

4人ずつでチームを組んで、4対4の試合をしようと思います。

頻繁にチームを変えようと思うのですが、
組み合わせの偏りが極力出ないようにしたいのです。

組み合わせの通りはXチームとYチームの区別がないので
「7C3」で35通りというのはなんとなく分かるのですが

例えば
ABCDとEFGHのそれぞれ4人に分かれた時、
次に2人ずつ入れ替わって
ABEFとCDGHになる。
その次にまた2人入れ替わって
ACEGとBDFHにしていく。

この場合、
ある程度偏りが出るのはわかるのですが、
極力連続して同じチームにならないようにする
法則性みたいなものはあるのでしょうか。
その都度確認しないといけないのでしょうか?

Aベストアンサー

No.1の補足を拝見しました。どうやら必要なのは、

(1) 8回戦のうちで、a氏とb氏が同じ組になった回数N(a,b)を、全てのa,bの組み合わせについてなるべく少なく抑えたい。
(2) 同じ組になったペアが、すぐ次の試合でも同じ組になるようなペアの組み合わせを出来るだけ少なくしたい。(このようなペアは最低でも4組あるのでした。)

という二つの条件でしょうか。ゲームを楽しむには、

(3) 一度も同じ組にならないようなペアが、極力できないようにする。
(4) どのペアもほぼ同じ回数だけ同じ組になるのが望ましい。

などの条件も入れたいかも知れません。類似の問題が過去↓にありますが、どうもコンピュータを使った力づくの計算で組み合わせ方を探すしかなさそうに思います。
 とは言っても全試合を通しての組み合わせはかなり多い(8試合として35×34×…×28通り)ので、ひょっとすると最適解を見つけるのは事実上無理で、条件をそこそこ満たしさえすれば良い、という基準で満足しなくちゃ駄目かも知れません。
 なお、試合数が違うと計算の規模がまるで違ってきます。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=718204

No.1の補足を拝見しました。どうやら必要なのは、

(1) 8回戦のうちで、a氏とb氏が同じ組になった回数N(a,b)を、全てのa,bの組み合わせについてなるべく少なく抑えたい。
(2) 同じ組になったペアが、すぐ次の試合でも同じ組になるようなペアの組み合わせを出来るだけ少なくしたい。(このようなペアは最低でも4組あるのでした。)

という二つの条件でしょうか。ゲームを楽しむには、

(3) 一度も同じ組にならないようなペアが、極力できないようにする。
(4) どのペアもほぼ同じ回数だけ同じ組になるのが...続きを読む

Q重複しないグループ分けをエクセルで

excel2010を使用しています。

1~9までを3つずつ3グループに分ける作業を4回行い、4回とも重複しないようにしたいのですが、エクセルの関数でうまく重複を避ける方法があるのでしょうか?

        Aグループ Bグループ Cグループ
1回目    1-2-3  4-5-6  7-8-9
2回目    1-4-7  2-5-8  3-6-9
3回目    ・・・
4回目    ・・・

のようにすべての回で重複しないようにしたいと思っています。
9つを3つずつ・・・は手書きでもなんとかなると思いますが
1~12を4つずつ3グループに重複しないで・・・
1~15を5つずつ3グループに重複しないで・・・
1~18を6つずつ3グループに重複しないで・・・
というように応用したいと思いますので、ぜひエクセルの関数かVBAのプログラムで作成できるようにしたいと思っていますが、どのような関数をどのように使えばいいのかわからず困っています。


どなたかご教授いただけないでしょうか。
  

Aベストアンサー

1~9なら重複なし、12なら重複1まで、15なら重複2まで、…24なら重複6までOKとして作ってみました。
並び替えに乱数を使っている手抜き版ですが、取りあえず動きます。
数値をB2セル以降に入れています。

コードが長くなったのとあまりに手抜きで恥ずかしいので、細かい説明は省略します。

Public nGroupData()
Public nRow As Integer
Sub test()
  Dim nTarget()
  Dim nMax As Long
  Dim nCount
  ReDim nGroupData(11)
  
  nRow = 1
  '対象配列を作成
  nMax = 9 '3で割り切れる数(9~24)。9以外にする場合はここを変更
  ReDim nTarget(nMax - 1)
  For i = 0 To (nMax - 1)
    nTarget(i) = i + 1
  Next i
  
  nCount = 0
  Do While nRow <= 4
    '配列をシャッフル
    nTarget = fShuffle(nTarget)
    
    '配列に重複が無いか確認
    If fChkTarget(nTarget) = True Then
      '重複なしならシート上に反映
      nTarget = fSortTarget(nTarget)
      For i = 0 To (nMax - 1)
        Cells(nRow + 1, i + 2) = nTarget(i)
      Next i
      nRow = nRow + 1
    Else
      nCount = nCount + 1
      '乱数に頼っているので1000回やっても重複なしにならなかったらGiveUp
      If nCount >= 1000 Then
        MsgBox ("GiveUP!")
        Exit Sub
      End If
    End If
  Loop
End Sub

' 配列をシャッフル
Private Function fShuffle(list)
  For i = 0 To UBound(list)
    Randomize Second(Now())
    nRn = Int(UBound(list) * Rnd)
    nTmp = list(i)
    list(i) = list(nRn)
    list(nRn) = nTmp
  Next i
  fShuffle = list
End Function

'グループ内でソート
Private Function fSortTarget(nTarget)
  Dim nGroup
  Dim nGrCount As Long
  Dim nWork(2)
  nGrCount = (UBound(nTarget) + 1) / 3
  For i = 0 To 2
    nSwap = 1000
    Do While nSwap <> 0
      nSwap = 0
      For j = (i * nGrCount) To ((i + 1) * nGrCount - 2) Step 2
        If nTarget(j) > nTarget(j + 1) Then
          nSwap = nTarget(j)
          nTarget(j) = nTarget(j + 1)
          nTarget(j + 1) = nSwap
        End If
      Next j
      For j = (i * nGrCount + 1) To ((i + 1) * nGrCount - 2) Step 2
        If nTarget(j) > nTarget(j + 1) Then
          nSwap = nTarget(j)
          nTarget(j) = nTarget(j + 1)
          nTarget(j + 1) = nSwap
        End If
      Next j
    Loop
    nGroup = 0
  Next i
  fSortTarget = nTarget
    
End Function

'重複をチェック
Private Function fChkTarget(nTarget) As Boolean
  Dim nWorkOne
  Dim nGrCount As Long
  Dim nWork(2), nChk, sChk
  fChkTarget = False
  
  nGrCount = (UBound(nTarget) + 1) / 3
  For i = 0 To 2
    nWorkOne = 0
    For j = 1 To nGrCount
       nWorkOne = nWorkOne + 2 ^ (nTarget(i * nGrCount + j - 1) - 1)
    Next j
    
    '重複していない個数を確認
    For k = 0 To ((nRow - 1) * 3 - 1)
      '検査対象と、今までのグループのデータでxorを取る
      nChk = (nWorkOne Xor nGroupData(k))
      sChk = fDec2Bin(nChk) '01の2進数文字列(24文字)に変換
      sChk = Replace(sChk, "0", "") '「0」を削除
      '1の個数=比較して重複していない個数
      '1の個数が規定より少なければ重複と判断
      If Len(sChk) < nGrCount Then Exit Function
    Next k
    nWork(i) = nWorkOne
  Next i
  For i = 0 To 2
    nGroupData(3 * (nRow - 1) + i) = nWork(i)
  Next i
  fChkTarget = True
End Function

'10進数を2進数のStringに変換
Private Function fDec2Bin(nData) As String
  '10進数を2進数のStringに変換(Max2^24)
  Dim nDataInt(2), i
  Dim sAns As String
  
  nDataInt(0) = Int(nData / (65536))
  nDataInt(1) = Int((nData Mod 65536) / 256)
  nDataInt(2) = nData Mod 256
  For i = 0 To 2
    sAns = sAns & Application.WorksheetFunction.Dec2Bin(nDataInt(i), 8)
  Next i
  fDec2Bin = sAns
End Function

1~9なら重複なし、12なら重複1まで、15なら重複2まで、…24なら重複6までOKとして作ってみました。
並び替えに乱数を使っている手抜き版ですが、取りあえず動きます。
数値をB2セル以降に入れています。

コードが長くなったのとあまりに手抜きで恥ずかしいので、細かい説明は省略します。

Public nGroupData()
Public nRow As Integer
Sub test()
  Dim nTarget()
  Dim nMax As Long
  Dim nCount
  ReDim nGroupData(11)
  
  nRow = 1
  '対象配列を作成
  nMax = 9 '3で割り切れる数(9~24...続きを読む

Q重複しないグループ分けについて

https://oshiete.goo.ne.jp/qa/8843774.html

で質問してプログラムを組んでくれた方がいましたが
応用できない場面が出てきてしまったので再び質問させて
いただきます。

前回の質問ではすべて3グループに分けられるように
していただきましたが、実はグループ数を固定するのではなく
1グループの人数を3人に固定しなければならなかったのです。

前回回答していただいたVBAのプログラムを編集して
1~12までを3ずつ4グループになるべく重複をしないで
複数回、分けるにはどうしたらいいでしょうか?
できれば複数回分けたところで全部の数が最低1回は同じ
グループに入るようにできると助かります。

今回も1-2-12と1-2-11は重複と考えます。

まったく重複なしで行うのは不可能だということは
わかりますが、できるだけ少ない重複で複数回(今回は最低6回)のグループ分け
を行いたいと思います。

前回のプログラムに説明も付け加えていただきましたが
よく理解できずに今日まできてしまいました。
大変申し訳ありませんがどうかご教授お願いします。

https://oshiete.goo.ne.jp/qa/8843774.html

で質問してプログラムを組んでくれた方がいましたが
応用できない場面が出てきてしまったので再び質問させて
いただきます。

前回の質問ではすべて3グループに分けられるように
していただきましたが、実はグループ数を固定するのではなく
1グループの人数を3人に固定しなければならなかったのです。

前回回答していただいたVBAのプログラムを編集して
1~12までを3ずつ4グループになるべく重複をしないで
複数回、分けるにはどうしたらいい...続きを読む

Aベストアンサー

【つづき】

上記で出来上がった表を元に、組合せパターン数の表を作成するもの
#7後半にもありましたが、その表の右側に 1_2_3 の様な表示を追加しています。
#7後半のものでも構いません。

Public Sub CheckPtn()
  Dim dicPtn As Object
  Dim vA As Variant, vB As Variant, v As Variant
  Dim i As Long, j As Long, k1 As Long, k2 As Long
  Dim iGrp As Long
  Dim vS As Variant, sS As String

  Set dicPtn = CreateObject("Scripting.Dictionary")
  With Range("B2")
    vA = .CurrentRegion.Value
    iGrp = .Cells(1).MergeArea.Count
    ReDim vB(1 To UBound(vA, 2) + 1, 1 To UBound(vA, 2) + 1)
    vB(1, 1) = "組"
    For i = 2 To UBound(vB)
      vB(1, i) = i - 1
      vB(i, 1) = i - 1
      vB(i, i) = "A"
    Next
    For i = 2 To UBound(vA)
      If (Val(vA(i, 1)) > 0) Then
        For j = 1 To UBound(vA, 2) Step iGrp
          sS = ""
          For k1 = 0 To iGrp - 2
            sS = sS & "_" & vA(i, j + k1)
            For k2 = k1 + 1 To iGrp - 1
              vB(vA(i, j + k1) + 1, vA(i, j + k2) + 1) = _
                vB(vA(i, j + k1) + 1, vA(i, j + k2) + 1) + 1
              vB(vA(i, j + k2) + 1, vA(i, j + k1) + 1) = _
                vB(vA(i, j + k2) + 1, vA(i, j + k1) + 1) + 1
            Next
          Next
          sS = sS & "_" & vA(i, j + k1)
          sS = Mid(sS, 2)
          dicPtn(sS) = dicPtn(sS) + 1
        Next
      End If
    Next
    With .Offset(UBound(vA) + 2)
      .CurrentRegion.Clear
      With .Resize(UBound(vB), UBound(vB))
        .Value = vB
        On Error Resume Next
        .Cells.SpecialCells(xlCellTypeBlanks) _
          .Interior.ColorIndex = 38
        .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1) _
          .SpecialCells(xlCellTypeConstants _
                  , xlTextValues).ClearContents
        .Columns(1).Interior.ColorIndex = 36
        .Rows(1).Interior.ColorIndex = 36
        .Borders.LineStyle = xlContinuous
        .HorizontalAlignment = xlCenter
        .EntireColumn.AutoFit
      End With
      
      ReDim vS(1 To dicPtn.Count, 1 To 2)
      i = 1
      For Each v In mySort2(dicPtn.Keys)
        vS(i, 1) = Join(v(1), "_")
        vS(i, 2) = dicPtn(v(0))
        i = i + 1
      Next
      With .Offset(, UBound(vB) + 1)
        .CurrentRegion.Clear
        With .Resize(dicPtn.Count, 2)
          .Value = vS
          .Borders.LineStyle = xlContinuous
        End With
      End With
    End With
  End With
  Set dicPtn = Nothing
End Sub

Private Function mySort2(ByVal vA As Variant) As Variant
  Dim vR As Variant, vS As Variant, v As Variant
  Dim i As Variant, j As Variant, k As Long, n As Long

  ReDim vR(LBound(vA) To UBound(vA))
  For i = LBound(vA) To UBound(vA)
    vS = Split(vA(i), "_")
    For j = 0 To UBound(vS) - 1
      For k = j + 1 To UBound(vS)
        If (Int(vS(j)) > Int(vS(k))) Then
          v = vS(j)
          vS(j) = vS(k)
          vS(k) = v
        End If
      Next
    Next
    vR(i) = Array(vA(i), vS)
  Next
  For i = LBound(vR) To UBound(vR) - 1
    For j = i + 1 To UBound(vR)
      For k = 0 To UBound(vS)
        If (Int(vR(i)(1)(k)) < Int(vR(j)(1)(k))) Then
          n = 0
          Exit For
        ElseIf (Int(vR(i)(1)(k)) > Int(vR(j)(1)(k))) Then
          n = 1
          Exit For
        End If
      Next
      If (n > 0) Then
        v = vR(i)
        vR(i) = vR(j)
        vR(j) = v
      End If
    Next
  Next
  mySort2 = vR
End Function

※ mySort2 は、文字列で与えられたものを1度バラして・・・ってやってます
(元々数値の表側を見ればもっと少ない記述になりますが)

【つづき】

上記で出来上がった表を元に、組合せパターン数の表を作成するもの
#7後半にもありましたが、その表の右側に 1_2_3 の様な表示を追加しています。
#7後半のものでも構いません。

Public Sub CheckPtn()
  Dim dicPtn As Object
  Dim vA As Variant, vB As Variant, v As Variant
  Dim i As Long, j As Long, k1 As Long, k2 As Long
  Dim iGrp As Long
  Dim vS As Variant, sS As String

  Set dicPtn = CreateObject("Scripting.Dictionary")
  With Range("B...続きを読む

Qエクセルで公平にチーム分けする方法を教えて下さい

20人のメンバーを2チームに分け毎週スポーツの練習をしています。毎回公平にチームメンバーが入れ替わる様にエクセルで設定してチーム分けのメンバー表を作りたいのですが、ご存じの方教えてください。

Aベストアンサー

他の方もご指摘されていますように、「公平」の意味がよく分かりませんが
「同じ組み合わせが無いように」という理解で考えてみました。
乱数を使用する方法では、低確率ですが同じ組み合わせが発生し得ます。

※以下Excel2007以降のバージョンでやって下さい。

メンバー20名の名前を横にA1セル~T1セルへ入力します。
[F11]キーを押して、左上のプロジェクトエクスプローラーからSheet1(Sheet1)を
Wクリックします。
右側のエディタエリアに以下のコードを貼り付けます。

Sub sample()
rIdx = 1
For i1 = 1 To 20
For i2 = i1 + 1 To 20
For i3 = i2 + 1 To 20
For i4 = i3 + 1 To 20
For i5 = i4 + 1 To 20
For i6 = i5 + 1 To 20
For i7 = i6 + 1 To 20
For i8 = i7 + 1 To 20
For i9 = i8 + 1 To 20
For i10 = i9 + 1 To 20
rIdx = rIdx + 1
Cells(rIdx, i1).Value = "A"
Cells(rIdx, i2).Value = "A"
Cells(rIdx, i3).Value = "A"
Cells(rIdx, i4).Value = "A"
Cells(rIdx, i5).Value = "A"
Cells(rIdx, i6).Value = "A"
Cells(rIdx, i7).Value = "A"
Cells(rIdx, i8).Value = "A"
Cells(rIdx, i9).Value = "A"
Cells(rIdx, i10).Value = "A"
For i = 1 To 20
If Cells(rIdx, i).Value <> "A" Then Cells(rIdx, i).Value = "B"
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
MsgBox ("終了しました")
End Sub

[F5]を押して実行します。
お使いのPCの能力にもよりますが、終わるまでに数分かかります。

この結果が『20名をA・Bチームに分ける全ての組み合わせ』です。
これを上から順にやれば重複無くチーム分けを行えます。

ただ、実際問題として、全ての組み合わせは18万4756通りあり、全ての
組み合わせを試すには1日1通りならば500年以上かかることになりますが。

他の方もご指摘されていますように、「公平」の意味がよく分かりませんが
「同じ組み合わせが無いように」という理解で考えてみました。
乱数を使用する方法では、低確率ですが同じ組み合わせが発生し得ます。

※以下Excel2007以降のバージョンでやって下さい。

メンバー20名の名前を横にA1セル~T1セルへ入力します。
[F11]キーを押して、左上のプロジェクトエクスプローラーからSheet1(Sheet1)を
Wクリックします。
右側のエディタエリアに以下のコードを貼り付けます。

Sub sample()
rIdx = 1
For i1 = 1...続きを読む

Q50人を数回、グループ分けする方法について。

グループ分けの方法について質問させて頂きます。

50人を7つのグループに分ける方法についてです。
人数は、7人グループ6つ、8人グループ一つです。

このグループ分けを5回行いますが、毎回、それぞれが
出来る限り同じグループになったことのない人とあたるように分けたいのですが・・・

何かうまい方法はないでしょうか。
よろしくお願い致します。

Aベストアンサー

   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、
   1,2,3,4,5,6,7、

   1,2,3,4,5,6,7、
   7、1,2,3,4,5,6、
   6,7、1,2,3,4,5,
   5,6,7、1,2,3,4,


49人でやってるけど

縦に7人でやる  横に1つづらして 縦に7人

横に7人  縦にずらして  横に7人

これで4回分

Qメンバー組合せ表の作り方

会社に社員13名おります。
その13名をランダムに3人の組合せを3グループ、4人の組合せを1グループの合計4グループ作り、ディスカッションする事になりました。
その組合せのメンバーは毎月変更し、この先1年は続ける予定です。
その組合せ表を作る事になったのですが、非常に難しいのでエクセル等での作り方を教えて下さい。

Aベストアンサー

A1:A13に以下の数式を入力
=rand()

B1:B13に社員の名前を入力

A1:B13を選択して、昇順で並べ替え

上から3人ずつグループ分け

こういうことでしょうか?

Q20人、24人で総当り

麻雀をするとき16人での総当りのやり方は知っているのですが、20人、24人で総当りを組むには、どうするのが一番効率が良いのでしょうか?

Aベストアンサー

#3です。
少し調べてみたら、こういうのが見つかりました。
▼組み合わせ表
http://www.asamiryo.jp/fst20.html
論理的にはパーフェクトじゃないですが、5回くらいですませることが前提なら、これで良いのではないかと思いました。

ちなみに16人のケースについては、
▼『麻雀大会』
http://web2.incl.ne.jp/yaoki/league5.htm
こういうのがありました。ここでも特に理論的な解説はありませんが、類似の方法を使って20人の場合を試したところ、やはり5回目までは重複無い組み合わせを作れたんですけど、6回目がうまくいきませんでした。20人だと6回目までは重複しない組み合わせが作れてもおかしくないんですが、良い方法が見つかりませんでした。

QExcelでの全通りの組み合わせ出力方法(文字列)

Excelについて全くの初心者で、教えて頂きたい質問があります。

Excelの文字列の全通りの組み合わせを出力がしたいのですが、その方法が分かりません。
例えばセルAに
・りんご
・みかん
・いちご

セルBに
・だいこん
・キャベツ
・トマト

があり、別のセルにその全通りの組み合わせを出力
(文字と文字の間はスペース)

りんご だいこん
りんご キャベツ
りんご トマト
みかん だいこん
みかん キャベツ
みかん トマト
いちご だいこん
いちご キャベツ
いちご トマト

この様に出来る方法はあるでしょうか?
また出来ればその裏(だいこん りんご)も出力したいと考えており、キーワードは3つまで出来るようになりたいです。

どなたかご存じでしたら、ぜひお教え下さい。
よろしくお願いします。

Aベストアンサー

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得
b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得
For i = 1 To a '1行からA列最終行まで繰り返し
For n = 1 To b '1行からB列最終行まで繰り返し
x = x + 1
Cells(x, "C") = Cells(i, "A") & " " & Cells(n, "B") 'C列に結合して転記
Next n
Next i
End Sub

3.Alt+F11キーでワークシートへもどります.

4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行

これでできます。
これがわかれば「裏」というのも簡単ですよね。
以上はVBAでの回答ですが、外していたらごめんなさい。

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得
b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得
For i = 1 To a '1行からA列最終行まで繰り返し
For n = 1 To b '1行...続きを読む

Q10人を2人づつ5組にランダムに分けて表示したい。

AからJまでの10人を1組2人づつに分ける組み合わせは
COMBIN(10,2)+COMBIN(8,2)+COMBIN(6,2)+COMBIN(4,2)=94通り
と思われますが、これら94の組み合わせの中から、任意の1つをランダムに表示出来るようにしたい、できればEXCEL(関数またはマクロ)で。
よろしくお願いいたします。

Aベストアンサー

>ランダムな順に10人をピックアップ」も人手ではなくパソコンでやって
>ほしいのです。

他の方の回答も含めて、そのつもりで回答されていると思いますけれど、何を人手でやるおつもりなのでしょうか?
マクロでやるならその通りの処理をOpenイベントで実行すればできますし、関数利用でも別に難しいことではありません。

関数の場合の一例を、説明した手順通りに分解して表示するなら…
A1~J1に対象となる名前があるとして
A2に =RAND()               :順番のもとになる乱数
A3に =RANK(A2,$A2:$J2)        :乱数を元に順番付け
A4に =MATCH(COLUMN(),$A3:$J3,0) :順に並べた時の対称の列番号
A5に =INDEX($A1:$J1,A4)        :乱数の順に並べ替えた名前
を入力して、A2~A5を選択して、右にコピーフィル。
5行目に乱数順に並べ替えた名前が表示されます。
(組み合わせは先頭から2人ずつ)

計算の手順がわかるように、1行ずつに途中経過を表示していますが、実際は途中を省略できますので、あとは適当にアレンジしてください。

(注意)Rankを使用しているので、乱数値がたまたままったく同じ値だとうまくいきませんが、RANDは実数になるので、そのようなことが起こる確率は非常に少ないと考えてよいとしています。

>ランダムな順に10人をピックアップ」も人手ではなくパソコンでやって
>ほしいのです。

他の方の回答も含めて、そのつもりで回答されていると思いますけれど、何を人手でやるおつもりなのでしょうか?
マクロでやるならその通りの処理をOpenイベントで実行すればできますし、関数利用でも別に難しいことではありません。

関数の場合の一例を、説明した手順通りに分解して表示するなら…
A1~J1に対象となる名前があるとして
A2に =RAND()               :順番のもとになる乱数
A...続きを読む

Q会社でゴルフコンペの予約や段取りの仕方

ゴルフを始めてまだ間もない者です。(コース経験2回)
今度会社でゴルフコンペがあり、その幹事をしないといけないのですが、まずコース選択や予約、当日を含む段取りまで一連の行動をどうすればいいのかよくわかりません。
知識をお教えください。
何か注意しなければならない事などもありましたらお教えください。
宜しくお願い致します。

Aベストアンサー

日程が決まったら、概算の参加数より少し多めの組数で、なるべく早く(最短でも1ヶ月程度前に)コース予約をします。
会社の上司などでメンバーコースを持っている人がいれば、コースを紹介してもらうと良いでしょう。
一組4人が原則ですから、予約組数は参加予想人員を4で割れば良いことになります。
コンペ終了後の、懇親会会場も概算人数で予約しておきます。

コースやスタート時間懇親会場が決まれば、会費や競技方法の詳細、表彰方式賞品なども提示して参加者を募ります。
その時に、生年月日とハンディキャップも申告してもらいます。
ハンディキャップが無い人も、だいたいの実力が把握出来るような申し込み方をしてもらいます。
ただし、順位を決める基本になるハンディキャップは、実力がはっきりしない人も参加するので「ダブルペリア」方式でハンディキャップを決める事になります。
その旨も申込書に記入することになりますが「ダブルペリア方式、ストロークプレー」と記載すれば良いでしょう。
ダブルペリア方式とは、その日のゴルフが済んだ実際のスコアを元にハンディキャップを決めて、それを元に順位を決めることになりますが、計算はあらかじめゴルフ場にお願いしておけばやってくれます。ただし、ハンディキャップの上限も決めて置きましょう。
さらに、順位賞の他に特別賞(ドラゴン、ニアピン、ベストスコア賞、BB賞)なども決めて、募集の時に発表する方が魅力有ります。

申し込みが確定したら、組み合わせを行ないます。
なるべく力がばらけるように、申告された予想実力で組み合わせをします。
初心者ばかりで組み合わせると、プレーの進行が遅れてしまいます。
必ず1組に一人は、経験豊富でルールやマナーに詳しい人を組み合わせます。
組み合わせに書き込む名簿は、ハンディキャップの少ない人(ベテラン)を各組の一番左側に記入して下さい。
参加人数に因りますが、それなりの組数の場合、最初の組がスタートする30分前には全員集合するように申し入れて置きます。

組み合わせは、遅くとも10日前には参加者に配ります。
変更がなければ、1週間前迄にゴルフ場にも組み合わせを送り、組数の確定を報告します。
先に申し込んだ組数を少なくする場合、遅くなるとキャンセル料を取るところも有りますから。
懇親会場への決定参加人数も報告して、予約を完了しておきましょう。

当日までに、参加人数に合わせて順位賞や特別賞を準備します。
ゴルフ場迄の交通手段によっては、なるべく少ない車で行けるように車の手配なども連絡し有って決めておくと良いでしょう。
急遽欠席の連絡があって組数が少なくなればその都度ゴルフ場にも連絡しておきます。
人数によっては3人の組も出てきますが、3人の組が4組出来た場合、組数を減らすことに成り、その場合組み合わせが変わることもありますが、それは当日3人の組の人をばらして他の組に入ってもらうことになります。

当日、幹事さんは1時間以上前にはゴルフ場に到着して受付をする事になります。
当日の会費を受け取る物や、参加者の出席確認及び連絡、組み合わせ変更があるなどばたばたしますので、出来れば3人は必要です。
又、懇親会場への賞品の持ち込みも忘れないように。(賞品を業者に任せた場合も確認を怠らないように)
ニアピンやドラゴンなどが有る場合は、コンペフラッグを必要数購入して、先頭の組に渡すのも忘れないように。
さらに各組の左端に書いた人に、競技終了後に同じ組の他の人のスコアを確認してもらい、ゴルフ場に提出してダブルペリア方式のハンディキャップを計算してもらって下さい。
幹事さんはなるべく最後の組に入って、コンペフラッグを忘れずに回収してきて下さい。
全員終了したら、ゴルフ場が出してくれたハンディキャップで順位を決め、特別賞も書き込んだ成績表をまとめます。
同ネット(成績が同じ)場合は、通常年齢の上の人が上位に成ります。(午前の成績で決めるなど色々あります)

他に、1位と2位の人(組)を当てる「ウマ」なども色々とコンペを盛り上げるアトラクションも有りますが、幹事さんの負担を考慮して楽しくなるように頑張って下さい。
捕捉要求が有れば、解る範囲ででお答えします。

日程が決まったら、概算の参加数より少し多めの組数で、なるべく早く(最短でも1ヶ月程度前に)コース予約をします。
会社の上司などでメンバーコースを持っている人がいれば、コースを紹介してもらうと良いでしょう。
一組4人が原則ですから、予約組数は参加予想人員を4で割れば良いことになります。
コンペ終了後の、懇親会会場も概算人数で予約しておきます。

コースやスタート時間懇親会場が決まれば、会費や競技方法の詳細、表彰方式賞品なども提示して参加者を募ります。
その時に、生年月日とハ...続きを読む


人気Q&Aランキング