web-dev-qa-db-ja.com

重複することなくランダムなペアを作成する

人をランダムにペアにしてユニークなペアにします。

2つの列があります。1つはRand()を介して作成された値を支援するもので、もう1つはこれらの値を

=INDEX($A$2:$A$164,RANK(S2,$S$2:$S$164))

ただし、これにより、2つのペアに多くの重複と円が生じます。

  1. フィリップ-ヘンドリック
  2. フラン-ルーシー
  3. ルーシー-フィリップ
  4. ヘンドリック-ヘンドリック

私が欲しいのは:

  1. フィリップ-ヘンドリック
  2. フラン-ルーシー
  3. ルーシー-フラン
  4. ヘンドリック-フィリップ

私は2つのグループを簡単に半分にすることができましたが、これは最善の解決策ではないようで、手動で行うと実際にはランダムではありません。

何か案は?

1
Moritz Andresen

モリッツ。すぐに、範囲に奇数のアイテムが含まれていることに気づきました($ A $ 2:$ A $ 164には163個のセルが含まれています)。だから誰もが誰かとペアになるわけではありません。どんな解決策でも、すべての名前を含めるには、範囲に常に偶数のセルがあることを確認する必要があります。この場合、1つmore人数よりも多い(つまり、$ A $ 2:$ A $ 165)。

また、ファイル>スプレッドシートの設定>計算設定が「変更時」に設定されていることを確認する必要があります。そうしないと、他の設定に応じて、リストが1分ごとまたは1時間ごとに自動的に再生成されます。現在選択されています。

つまり、列Aの名前以外に設定した列は無視して、ゼロから始めます。これを実際の設定に適用できます。

  1. 配列数式の準備として、列Bを完全にクリアします。これは、必要に応じて後で非表示にできる「ヘルパーカラム」になります。

  2. 次の式をB2に入れます。

=ArrayFormula(QUERY({A2:A165,RANDBETWEEN(0 * ROW(A2:A165), 100000000000000)/100000000000000},"Select Col1 Order By Col2"))

  1. 次の数式を2つの開いた列が並んでいる場所に他の場所に配置します(たとえば、引数としてC2)。

=ArrayFormula({QUERY({ROW(B2:B165)-1,B2:B165},"Select Col2 Where Col1 <= "&ROWS(B2:B165)/2),QUERY({ROW(B2:B165)-1,B2:B165},"Select Col2 Where Col1 > "&ROWS(B2:B165)/2)})

列Bの数式は、ランダム化された重複しない名前のリストを提供します。

列Cの数式は、リストの上半分を受け取り、下半分とペアにします。

これを(私の知る限り)1つの数式にマージすることはできません。ランダム化関数は長い数式内の各サブ数式によってトリガーされるため、重複が発生するためです。 Rand()を使用して単一のヘルパー列を作成することにより、他の数式を使用してreferしながら、重複を取得することはできません。

0
Erik Tyler
=QUERY(ARRAY_CONSTRAIN(SORT({
 {QUERY(UNIQUE(ARRAYFORMULA(RANDBETWEEN(ROW(INDIRECT("A2:A"&COUNTA(A2:A)*100))^0,
  COUNTA(A2:A)*COUNTA(A2:A)-COUNTA(A2:A)))), "limit "&
  COUNTA(A2:A)*COUNTA(A2:A)-COUNTA(A2:A))}, 
 {ARRAYFORMULA(QUERY(SPLIT(
  TRANSPOSE(SPLIT(REPT(CONCATENATE(A2:A&CHAR(9)), COUNTA(A2:A)),  CHAR(9)))&" "&
  TRANSPOSE(SPLIT(CONCATENATE(REPT(A2:A&CHAR(9),  COUNTA(A2:A))), CHAR(9)))," "),
  "select Col1 where Col1<>Col2", 0)&" - "&QUERY(SPLIT(
  TRANSPOSE(SPLIT(REPT(CONCATENATE(A2:A&CHAR(9)), COUNTA(A2:A)),  CHAR(9)))&" "&
  TRANSPOSE(SPLIT(CONCATENATE(REPT(A2:A&CHAR(9),  COUNTA(A2:A))), CHAR(9)))," "),
  "select Col2 where Col1<>Col2", 0))}}, 1, 1), 4, 2), "select Col2", 0)

  • 注1:必要なのは列[〜#〜] a [〜#〜]名前を入力
  • note2:より多く/より少ないペアが必要な場合は、4を目的の数に

「自分の列の各ペア名」モードにする場合は、次のようにします。

=ARRAYFORMULA(SPLIT(QUERY(ARRAY_CONSTRAIN(SORT({
 {QUERY(UNIQUE(ARRAYFORMULA(RANDBETWEEN(ROW(INDIRECT("A2:A"&COUNTA(A2:A)*100))^0,
  COUNTA(A2:A)*COUNTA(A2:A)-COUNTA(A2:A)))), "limit "&
  COUNTA(A2:A)*COUNTA(A2:A)-COUNTA(A2:A))}, 
 {ARRAYFORMULA(QUERY(SPLIT(
  TRANSPOSE(SPLIT(REPT(CONCATENATE(A2:A&CHAR(9)), COUNTA(A2:A)),  CHAR(9)))&" "&
  TRANSPOSE(SPLIT(CONCATENATE(REPT(A2:A&CHAR(9),  COUNTA(A2:A))), CHAR(9)))," "),
  "select Col1 where Col1<>Col2", 0)&" - "&QUERY(SPLIT(
  TRANSPOSE(SPLIT(REPT(CONCATENATE(A2:A&CHAR(9)), COUNTA(A2:A)),  CHAR(9)))&" "&
  TRANSPOSE(SPLIT(CONCATENATE(REPT(A2:A&CHAR(9),  COUNTA(A2:A))), CHAR(9)))," "),
  "select Col2 where Col1<>Col2", 0))}}, 1, 1), 4, 2), "select Col2", 0), " - "))

0
user0