Nous avons organisé un petit cadeau pour le lancement de Toolz, et j'ai fait le tirage au sort paresseux : j'ai collé la liste des participants dans une feuille de calcul, j'ai ajouté une colonne de =RAND()[TRADUCTION], et trié par là Cela a marché, mais un ami qui fait des statistiques pour gagner ma vie a regardé par-dessus mon épaule et a dit, " ; tu sais que ce n'est pas vraiment uniforme, non ?" ; Il avait raison, et le terrier de lapin dans lequel je suis tombé ce soir-là est une grande partie de la raison pour laquelle Toolz a maintenant un propre randomiseur de liste ça fait le shuffle de la bonne façon Ce guide est ce que j'ai appris, écrit pour tous ceux qui ont besoin de tirer des noms d'un chapeau et qui veulent que le chapeau soit honnête.
tl;dr : Un randomiseur de liste soit réorganise une liste entière au hasard (shuffle), soit en tire un échantillon aléatoire (pick).Les bons utilisent le shuffle de Fisher-Yates et une source aléatoire cryptographique pour que chaque commande soit également probable Utilisez shuffle pour l'ordre des tours et les sièges, et choisissez pour les cadeaux et les échantillons Cet outil fonctionne côté client, tire sans remplacement par défaut pour que les gagnants soient uniques et refuse de dessiner plus d'éléments uniques que ce que la liste contient.
Je construis des produits SaaS sur Laravel et React, donc je me soucie de deux choses ici : obtenir les bons calculs, et rendre l'interface suffisamment évidente pour qu'on ne se demande jamais si le tirage au sort était juste Les deux s'avèrent avoir plus d'importance qu'ils n'en ont l'air.
Qu'est-ce qu'un randomiseur de liste ?
Un randomiseur de liste prend une liste d'éléments, un par ligne, et la réorganise ou l'échantillonne au hasard Un mélange équitable est un problème résolu avec une mauvaise réponse qui semble bonne : le tri par une clé aléatoire est biaisé, tandis que le mélange Fisher-Yates ne l'est pas, et le navigateur fournit les bits impartiaux via crypto.getRandomValues(). Collez les noms, les prix, les tâches, les équipes ou les idées, et soit il remet toute la liste dans un ordre mélangé, soit il sélectionne le nombre de gagnants que vous avez demandé. Il s'agit de la version logicielle consistant à dessiner des feuillets pliés dans un bol, avec l'avantage de supprimer le biais silencieux que les humains introduisent lorsqu'ils tentent de choisir " ; aléatoirement" ; à la main.
Il n'y a vraiment que deux opérations, et savoir laquelle vous voulez est la compétence entière Shuffle retourne chaque élément que vous lui avez donné, juste dans un nouvel ordre aléatoire, donc rien n'est ajouté ou perdu Pick retourne un sous-ensemble, tirant un nombre défini d'éléments hors de la piscine Une tombola est un choix Décider qui présente en premier dans un stand-up est un shuffle La plupart des gens atteignent le mauvais au moins une fois, en essayant généralement de " ; shuffler et prendre les trois premiers" ; quand Pick avec un compte de trois fait la même chose en une étape.
Comment fonctionne réellement un mélange équitable ?
Voici la partie à laquelle mon ami statisticien se rendait L'astuce du tableur, attribuant un nombre aléatoire à chaque ligne et triant, semble aléatoire mais n'est pas uniforme Les algorithmes de tri font des comparaisons, et quand deux clés aléatoires se trouvent être proches, de minuscules biais dans la façon dont les liens et les comparaisons résolvent s'infiltrent dans le résultat Sur les petites listes, le biais est petit, mais il est réel, et pour tout ce qui est où l'équité est le point, " ; assez proche" ; n'est pas une excellente réponse.
La méthode correcte est le shuffle Fisher-Yates, parfois appelé le shuffle de Knuth après que Donald Knuth ait popularisé la version sur place Il a été décrit par Ronald Fisher et Frank Yates en 1938 et étant donné sa forme informatique moderne par Richard Durstenfeld en 1964 L'idée est simple Marchez la liste du dernier élément au second A chaque position, choisissez un index aléatoire du début de la liste jusqu'à la position actuelle incluse, puis échangez les deux éléments Parce que chaque swap tire d'une plage rétrécissante et bien définie, chacun des ordres possibles sort avec une probabilité exactement égale Il s'exécute en temps linéaire, touchant chaque élément une fois plus de mémoire et n'en faut.
le randomiseur de liste utilise cet algorithme directement Lorsque vous choisissez sans remplacement, c'est le même mélange arrêté tôt : mélangez la liste, puis prenez les N premiers éléments Cela garantit que les gagnants sont distincts et que chaque groupe possible de gagnants est également probable.
D'où vient le hasard ?
Un algorithme n'est aussi juste que les nombres aléatoires qui le nourrissent Si la source du hasard est prévisible ou biaisée, un remaniement parfait produit toujours un résultat biaisé C'est là que le navigateur gagne sa garde.
Les navigateurs modernes exposent crypto.getRandomValues[traduction], une partie de l'API de cryptographie Web W3 C, qui remplit un tableau avec des valeurs aléatoires cryptographiquement fortes tirées du pool d'entropie du système d'exploitation C'est une source beaucoup plus forte que Math.random[traduction], qui est un générateur pseudo-aléatoire rapide jamais destiné à quoi que ce soit où la prévisibilité importe Le randomiseur préfère crypto.getRandomValues et ne retombe que sur Math.random lorsque la source cryptographique est véritablement indisponible, ce qui sur un navigateur actuel n'est presque jamais le cas.
Il y a encore une subtilité que j'ai dû obtenir juste Pour transformer un nombre aléatoire de 32 bits en un indice impartial de 0 à N moins 1, vous ne pouvez pas simplement prendre le reste après avoir divisé par N, car à moins que N ne divise uniformément dans la plage, les indices bas reviennent légèrement plus souvent Le correctif est l'échantillonnage de rejet : calculer le plus grand multiple de N qui s'inscrit dans la plage, et si un tirage atterrit au-dessus de cette coupure, jetez-le et dessinez à nouveau. Cela coûte un nombre négligeable de tirages supplémentaires et supprime entièrement le biais. L'outil le fait sur chaque index qu'il sélectionne, ce qui est le genre de détail que personne ne remarque jusqu'il manque.
Comment utiliser le randomiseur ?
L'interface a un bouton et quelques choix Voici comment je l'exécute.
Collez votre liste dans la zone de saisie, un élément par ligne Si vous avez copié une cellule séparée par des virgules hors d'une feuille de calcul, passez le séparateur de saisie en virgule et il se divisera plutôt en virgules Le comportement de trim et de drop-blank est activé par défaut, donc les lignes vides parasites et les espaces de connexion accidentels ne deviennent pas des entrées fantômes.
Choisissez votre mode Shuffle réorganise tout Pick tire les gagnants Si vous choisissez Pick, un petit panneau apparaît où vous définissez le nombre à dessiner et si les répétitions sont autorisées Laissez les répétitions pour un cadeau afin que chaque gagnant soit une personne différente Allumez les répétitions uniquement lorsque vous voulez réellement échantillonner avec remplacement, par exemple lorsque vous simulez des tirages de type dés et que la même valeur peut légitimement se reproduire.
Cliquez sur Randomiser Vous obtenez un résultat frais et indépendant à chaque fois, donc si vous voulez redessiner, cliquez simplement à nouveau. Copiez la sortie d'un clic pour la coller dans votre annonce, votre ticket ou partout où le résultat doit vivre Si vous demandez plus de gagnants uniques que la liste ne peut fournir, l'outil vous le dit au lieu de renvoyer tranquillement une liste courte ou répétée, ce qui est une erreur que j'ai vu d'autres outils faire.
En pratique, les listes que je colle sont partout sur la carte Certains jours, c'est une colonne d'e-mails de clients pour un tirage au sort, d'autres jours, ce sont les noms de mon équipe pour qui examine la prochaine demande d'extraction, et une fois que c'était chaque restaurant à distance de marche parce que personne ne pouvait décider du déjeuner L'outil ne se soucie pas de ce que sont les articles, seulement qu'ils sont séparés proprement C'est pourquoi les options d'entrée valent une seconde d'attention : si votre source est une cellule de feuille de calcul, le séparateur de virgule vous évite de faire de l'édition manuelle, et s'il s'agit d'un copier désordonné avec des lignes vides, le nettoyer par défaut.
Quand dois-je mélanger et quand dois-je choisir ?
Les deux modes couvrent des travaux différents, et le tableau ci-dessous est le aide-mémoire que j'aurais aimé avoir lorsque j'ai commencé.
| Vous voulez... | manier | Répéte | pourquoi |
|---|---|---|---|
| Décidez de parler ou tournez l'ordre | Mélanger | n/a | Tout le monde reste, l'ordre est juste |
| Dessinez un gagnant du concours | Choisissez, comptez 1 | Off | Résultat unique unique |
| Dessinez plusieurs gagnants de prix | Choisissez, comptez N | Off | Des gagnants distincts, pas de double trempage |
| Affecter des personnes à deux équipes | Mélangez, puis divisez | n/a | Divisez la liste mélangée en deux |
| Échantillon avec remplacement pour une sim | Choisissez, comptez N | Sur | Le même élément peut se reproduire dès la conception |
| Randomisez une liste de lecture ou une liste de lecture | Mélanger | n/a | Réorganiser sans rien laisser tomber |
La règle empirique : si le nombre d'éléments doit rester le même, mélangez Si vous voulez moins d'éléments que vous mettez dedans, choisissez L'affectation d'équipe est celle que les gens réfléchissent trop Mélanger la liste complète, puis prenez la première moitié comme équipe A et le reste comme équipe B, et les deux équipes sont aléatoires et équilibrées en taille.
Est-ce assez juste pour organiser un cadeau public ?
Oui, et la raison vaut la peine d'être énoncée clairement parce que " ; fair" ; est la valeur entière de l'outil La combinaison d'un mélange Fisher-Yates, d'une source aléatoire cryptographique et d'un échantillonnage de rejet signifie que chaque participant a une chance identique et que chaque ensemble possible de gagnants est tout aussi probable C'est une garantie plus forte qu'un tirage physique, où la taille du glissement, le pliage et la façon dont le bol est mélangé introduisent tous un biais.
Parce que le tirage s'exécute entièrement dans votre navigateur, vous pouvez le faire en direct à l'écran pendant un flux ou une réunion, qui est la transparence que les gens veulent d'un tirage public Rien n'est envoyé à un serveur, donc il n'y a pas d'étape cachée où le résultat pourrait être falsifié entre votre clic et l'annonce Si vous voulez une piste d'audit, enregistrez le tirage au sort par écran : la liste des participants est visible, le clic est visible, et les gagnants apparaissent immédiatement.
Ma liste est-elle privée ?
Cela compte plus qu'il n'y paraît au départ, car les listes que les gens randomisent ne sont souvent pas publiques. Les listes restreintes de candidats, les noms d'équipe internes, les entrées clients et les listes de diffusion sont tous sensibles. Le randomiseur traite tout localement avec du JavaScript simple. Votre liste n'est jamais téléchargée, enregistrée ou stockée, et vous pouvez le confirmer dans l'onglet réseau de votre navigateur, où cliquer sur Randomize ne déclenche aucune demande. Il continue également de fonctionner hors ligne une fois la page chargée.
C’est une position délibérée à l’égard de Toolz, et j’ai écrit sur le raisonnement dans la note sur Confidentialité des données dans les outils en ligne. Un randomiseur est un bon exemple de la raison pour laquelle cela est important : l'entrée est souvent une liste de personnes réelles, et une liste de personnes réelles est exactement le genre de chose que vous ne voulez pas voir assis dans un journal de requêtes sur un serveur que vous n'avez jamais audité.
Quelques habitudes qui rendent les tirages plus propres
Nettoyez la liste avant de dessiner Allumez supprimer les doublons si une personne peut apparaître deux fois, donc une double entrée ne double pas secrètement ses chances L'abandon des lignes vierges est activé par défaut, mais il vaut la peine d'un coup d'œil pour s'assurer qu'une ligne vide traînante n'a pas été comptée.
Faites correspondre le décompte aux prix En mode Pick, définissez le décompte sur le nombre exact de gagnants dont vous avez besoin et laissez les répétitions Si vous avez trois prix, tirez trois à la fois plutôt que de cliquer trois fois sur un seul tirage, ce qui évite que le cas gênant du même nom ne apparaisse deux fois sur des clics séparés.
Redessinez ouvertement, pas secrètement Si un gagnant est inéligible, retirez-le et redessinez devant celui qui regarde L'équité vient du fait que le processus est visible, pas du résultat final au premier clic.
Gardez-le dans le navigateur Comme pour chaque outil que j'expédie, le traitement local est la valeur par défaut car il est plus rapide et privé Si vous assemblez un kit personnel de petits utilitaires, le générateur de nombres aléatoires s'associe naturellement au randomiseur pour les tirages numériques, et au plus large Outils de productivité des développeurs roundup explique pourquoi une boîte à outils axée sur le navigateur vaut la peine d'être construite.
Les outils connexes méritent un coup d'œil
Si la sélection aléatoire est un besoin récurrent, quelques voisins sont assis à proximité. Le générateur de nombres aléatoires dessine des nombres dans une plage avec le même caractère aléatoire de qualité crypto, ce que vous voulez lorsque la chose que vous choisissez est une valeur plutôt qu'un élément d'une liste. Le Générateur UUID produit des identifiants uniques pour les enregistrements et les données de test. Le générateur de mot de passe applique la même source aléatoire forte à la production de mots de passe sécurisés Tous les trois s'exécutent dans le navigateur sans inscription, exactement comme le randomiseur, et je couvre le côté identifiant de cette famille dans le guide du générateur de mot de passe.
Questions fréquentes
Comment fonctionne le randomiseur de liste ?
L'outil lit votre liste d'un élément par ligne, puis réorganise chaque élément ou attire les gagnants que vous avez demandés. Shuffling utilise l'algorithme Fisher-Yates, qui parcourt la liste une fois et échange chaque élément avec une position antérieure choisie au hasard, produisant un ordre uniformément aléatoire. Les positions aléatoires proviennent du générateur cryptographique du navigateur, de sorte que le résultat est véritablement impartial.
La randomisation est-elle vraiment juste ?
Oui. Il s'inspire de crypto.getRandomValues, la source aléatoire cryptographique intégrée aux navigateurs modernes, et utilise l'échantillonnage par rejet afin qu'aucun index ne soit même légèrement plus probable qu'un autre. Combiné avec le mélange Fisher-Yates, chaque ordre possible de votre liste a une chance égale, ce qui est plus juste qu'un mélange manuel ou un tri par feuille de calcul avec une clé aléatoire.
Comment puis-je choisir un gagnant au hasard dans une liste de noms ?
Collez vos noms un par ligne, passez en mode de sélection, définissez le nombre sur 1 et cliquez sur Randomiser. L'outil renvoie un seul nom aléatoire. Pour dessiner plusieurs gagnants à la fois, réglez le nombre de points et laissez les répétitions désactivées afin que chaque gagnant soit unique.
Quelle est la différence entre shuffle et pick ?
Shuffle renvoie toute votre liste dans un nouvel ordre aléatoire, donc rien n'est ajouté ou supprimé, uniquement réorganisé. Pick renvoie un sous-ensemble, tirant le nombre de gagnants que vous spécifiez dans la liste. Utilisez Shuffle pour tourner l'ordre ou les sièges, et choisissez les cadeaux, les échantillons ou le choix de quelques personnes d'un groupe plus important.
Le même article peut-il être choisi plus d'une fois ?
Seulement si vous activez les répétitions Par défaut, le mode Pick tire sans remplacement, donc chaque gagnant est un élément différent, ce qui est ce dont un tirage au sort ou un cadeau a besoin La mise en marche des répétitions permet l'échantillonnage avec remplacement, où le même élément peut remonter, ce qui est utile pour les simulations.
Pourquoi ne peut-il pas choisir plus d'articles uniques que ma liste ?
Sans répétition, chaque gagnant doit être un élément distinct, vous ne pouvez donc pas tirer dix gagnants uniques à partir d'une liste de huit. Lorsque cela se produit, l'outil vous le dit au lieu de retourner un mauvais résultat. Réduisez le nombre de nombres pour correspondre à la taille de votre liste ou activez les répétitions afin que les éléments puissent être réutilisés.
Ma liste est-elle téléchargée sur un serveur ?
Non. Toutes les analyses et randomisations s'exécutent localement dans votre navigateur avec JavaScript simple, et rien n'est transmis, enregistré ou stocké. Vous pouvez le confirmer dans l'onglet réseau de votre navigateur, où aucune demande n'est effectuée lorsque vous cliquez sur Randomize. Cela fonctionne également hors ligne une fois la page chargée.
Puis-je l'utiliser pour une tombola ou un cadeau ?
Oui. Collez vos participants une par ligne, utilisez le mode de sélection avec les répétitions désactivées et définissez le nombre de prix. Chaque clic tire un ensemble frais et indépendant de gagnants uniques. Parce que le tirage au sort est impartial et que le côté client se produit, vous pouvez l'exécuter en direct à l'écran pour plus de transparence.



