web-dev-qa-db-fra.com

Créez des paires aléatoires sans doublons

J'essaie de jumeler des gens au hasard en paires uniques.

J'ai deux colonnes, l'une avec les valeurs d'aide créées via Rand() et l'autre qui se classe sur ces valeurs avec

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

Cependant, cela se traduit par de nombreux doublons et cercles dans les deux paires:

  1. Phillip - Hendrik
  2. Fran - Lucy
  3. Lucy - Phillip
  4. Hendrik - Hendrik

Ce que je veux c'est:

  1. Phillip - Hendrik
  2. Fran - Lucy
  3. Lucy - Fran
  4. Hendrik - Phillip

Je pourrais facilement la moitié des deux groupes mais cela ne semble pas être la meilleure solution et pas vraiment aléatoire si je le fais manuellement.

Des idées?

1
Moritz Andresen

Moritz. Immédiatement, je remarque que votre gamme contient un nombre impair d'articles ($ A $ 2: $ A $ 164 contient 163 cellules); donc tout le monde ne sera pas jumelé avec quelqu'un. Dans toute solution, alors, pour inclure tous les noms, vous devez vous assurer que votre plage a toujours un nombre pair de cellules, dans ce cas une de plus que le nombre de personnes (c.-à-d. $ A $ 2: $ A $ 165).

De plus, vous voudrez être certain que votre paramètre Fichier> Paramètres de la feuille de calcul> Calcul est défini sur "en cas de modification" ou votre liste sera régénérée automatiquement toutes les minutes ou toutes les heures, en fonction de l'autre paramètre est actuellement sélectionné.

Cela dit, je vais recommencer à zéro, en ignorant toutes les colonnes que vous avez configurées à part les noms de la colonne A. Ensuite, vous pouvez appliquer cela à votre configuration réelle:

  1. Effacez la colonne B entièrement en préparation d'une formule matricielle. Ce sera une "colonne d'aide" qui peut se cacher plus tard si vous le souhaitez.

  2. Placez la formule suivante dans B2:

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

  1. Placez la formule suivante n'importe où ailleurs qui a deux colonnes ouvertes côte à côte (disons C2, pour les besoins de l'argument):

=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)})

La formule de la colonne B fournira une liste aléatoire et sans duplication de vos noms.

La formule de la colonne C prendra la moitié supérieure de cette liste et l'associera à la moitié inférieure.

Vous ne pouvez pas (à ma connaissance) fusionner cela en une seule formule, car les fonctions de randomisation sont déclenchées par chaque sous-formule dans une formule plus longue, vous vous retrouveriez donc avec des doublons. En créant une seule colonne d'aide avec Rand (), nous pouvons y faire référence avec l'autre formule sans obtenir de doublons.

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)

  • note1: tout ce dont vous avez besoin est la colonne [~ # ~] a [~ # ~] rempli de noms
  • note2: si vous voulez plus/moins de paires, changez 4 au nombre souhaité

si vous voulez qu'il soit en mode "chaque nom de paire dans sa propre colonne", alors:

=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