Outil de Sélection Aléatoire
Outil de sélection aléatoire équitable pour tirages, sélections et choix
Qu'est-ce qu'un Outil de Sélection Aléatoire ?
Un sélecteur aléatoire choisit un élément dans une liste sans qu’une personne décide manuellement. Il sert pour la participation en classe, l’ordre de passage en réunion, les petits tirages, la répartition de tâches, le choix du repas, les activités d’équipe et toute situation où une décision neutre visible limite les biais. Cette page accepte une liste ligne par ligne, peut animer le tirage, conserver un historique local et éviter les répétitions en retirant les éléments déjà choisis. Le hasard peut rendre le choix statistiquement équitable, mais il ne vérifie pas les identités, ne détecte pas automatiquement les doublons et ne fournit pas de preuve d’audit. Pour un tirage officiel, l’éligibilité ou la remise de prix, utilisez une procédure documentée.
Mode d'emploi
Étapes d'utilisation
- Saisissez les options dans la zone de texte, une par ligne
- Indiquez le nombre d'éléments à sélectionner
- Choisissez si les doublons sont autorisés
- Cliquez sur « Lancer le tirage »
- Consultez les résultats sur la partie droite
Conseils pour un tirage équitable
- Mettez un candidat par ligne et retirez les lignes vides ou doublons accidentels, sauf si les doublons sont autorisés volontairement.
- Pour les tirages publics, décidez à l'avance de la graine, de la règle sur les doublons et de la règle de re-tirage pour faciliter l'explication du résultat.
Cas d’utilisation
Principe technique
Le sélecteur aléatoire repose sur l'API Web Crypto (W3C, WHATWG), plus précisément crypto.getRandomValues(typedArray), qui est la seule source de nombres aléatoires cryptographiquement sécurisée exposée dans les navigateurs. En coulisses, le navigateur appelle le CSPRNG du système d'exploitation : CryptGenRandom sur Windows (AES-256 en mode CTR-DRBG depuis Windows 10), getrandom(2) sur Linux (qui lit depuis le même pool basé sur ChaCha20 alimentant le /dev/urandom du noyau), SecRandomCopyBytes sur macOS, et l'équivalent sur iOS, Android et BSD. La sortie convient pour la génération de clés, les nonces, les sels, les IV et tout endroit où la prévisibilité poserait un problème de sécurité. La distinction « niveau cryptographique » est importante. Math.random() dans V8 utilise xorshift128+ (un algorithme rapide à faible entropie) et renvoie un flottant 64 bits dans [0, 1) ; un acteur malveillant observant quelques sorties peut en principe reconstituer l'état de 128 bits et prédire chaque valeur future. Il en va de même pour SpiderMonkey et JavaScriptCore. Cela rend Math.random() inadapté à toute utilisation où le résultat doit être imprévisible — sélection équitable d'un gagnant, un jeton, un mot de passe à usage unique, une donne dans un jeu de cartes, un échantillon d'audit. crypto.getRandomValues(typedArray) est le seul choix pour ces cas. La conversion d'entiers 32 bits uniformes en un index uniforme dans [0, N) sans biais de modulo est le second détail technique qui distingue une implémentation correcte d'une implémentation défaillante. La formule naïve idx = randomUint32 % N est incorrecte : si N ne divise pas 2^32, les 2^32 mod N premières valeurs sont légèrement plus probables. L'algorithme correct est l'échantillonnage par rejet : calculer limit = 2^32 - (2^32 mod N) ; tirer une valeur 32 bits r ; si r >= limit, retirer ; sinon renvoyer r % N. Le biais passe de O(N / 2^32) à zéro. Pour N = 2 ou N puissance de 2, le modulo est exact, mais l'échantillonnage par rejet est le choix sûr par défaut et ne coûte au maximum qu'un retraitement en moyenne (et se termine toujours). Le sélecteur stocke les résultats dans localStorage avec une clé versionnée, de sorte qu'une session peut survivre au rechargement de la page et qu'un utilisateur peut consulter l'historique des tirages. L'historique n'est ni chiffré ni signé — il est local, non sensible et facile à effacer. Pour le mode sans répétition, l'algorithme tire sans remise en utilisant un mélange partiel de Fisher-Yates : à l'étape k sur N, on échange l'élément k avec un élément choisi uniformément dans [k, N) et on verrouille l'élément k comme tiré. Cela donne une complexité O(N) en temps, O(1) en espace supplémentaire, et garantit une probabilité égale pour chaque permutation, ce qui constitue la bonne garantie combinatoire. (L'approche naïve « tirer N fois en rejetant les répétitions » est aussi correcte mais en O(N²) et peut stagner sur de longues sessions.) Pour les sélections pondérées (chaque option a sa propre probabilité), l'algorithme standard est l'échantillonnage par inverse de la fonction de répartition (CDF inverse) avec un tableau de sommes préfixées : on construit une somme préfixée des poids, on tire un réel uniforme dans [0, total) et on recherche binairement le plus petit i tel que prefix[i] >= u. Cela donne O(log N) par tirage, et la somme préfixée n'est construite qu'une fois par modification. La méthode d'alias (Walker-Vose) donne O(1) par tirage au prix d'une construction en O(N), ce qui n'est rentable que lorsque N est grand et la distribution fixe.
- Source d'aléa : crypto.getRandomValues(typedArray) — le seul RNG cryptographiquement sécurisé dans les navigateurs, soutenu par le CSPRNG du système (AES-256 CTR-DRBG sur Windows 10+, ChaCha20 sur Linux/macOS/iOS/Android).
- Math.random() est xorshift128+ sur V8 (et variantes sur les autres moteurs) : rapide mais prévisible. Ne jamais l'utiliser pour une sélection équitable, des jetons, des OTP ou des échantillons d'audit — uniquement pour du bruit visuel, des animations ou de l'échantillonnage non sécurisé.
- Mapping d'index sans biais : échantillonnage par rejet, pas modulo. Calculer limit = 2^32 - (2^32 mod N) ; si le uint32 aléatoire >= limit, retirer ; sinon renvoyer r % N. Évite le classique « biais de modulo » où les index de faible plage apparaissent plus souvent.
- Les tirages sans répétition utilisent le mélange partiel de Fisher-Yates en O(N) temps, O(1) espace : à l'étape k, échanger l'élément k avec un élément uniforme dans [k, N), puis verrouiller k. Chaque permutation est équiprobable.
- Les sélections pondérées utilisent l'échantillonnage par CDF inverse : construire une somme préfixée des poids une fois, tirer un réel uniforme dans [0, total), rechercher binairement le plus petit prefix[i] >= u. O(log N) par tirage.
- L'historique des tirages est persisté dans localStorage avec une clé versionnée, de sorte qu'une session survit au rechargement de la page. L'historique est local uniquement et non sensible en termes de sécurité — effacez-le depuis l'interface une fois terminé.
- Fisher-Yates vs « tirer N fois avec rejet » : les deux sont corrects en termes de distribution, mais Fisher-Yates est O(N) au total et O(1) en mémoire, tandis que le rejet naïf est O(N²) dans le pire cas (beaucoup de répétitions vers la fin d'une longue liste).
- Plage de sortie et types : getRandomValues accepte Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, BigUint64Array — et la page utilise toujours Uint32Array pour alimenter l'étape de mapping d'index.
Exemples
Tirage sans répétition dans une liste de candidats
Liste d'entrée (un par ligne) :
Alice
Bob
Charlie
David
Eve
Frank
Autoriser les doublons : OFF Tirages : 3
Résultat :
#1 : Charlie
#2 : Alice
#3 : Frank
(Bob, David, Eve restent dans le pool)
La page appelle crypto.getRandomValues() sur un Uint32Array pour générer
un entier uniforme dans [0, n) à chaque tirage, où n est le nombre de
candidats restants. Chaque nom a la même probabilité 1/n à chaque tirage,
et l'index choisi est fixé avant le début de l'animation.Tirage avec doublons et historique horodaté
Liste d'entrée (un par ligne) :
Head
Tails
Autoriser les doublons : ON Tirages : 5
Résultat :
#1 (14:23:01) : Head
#2 (14:23:01) : Tails
#3 (14:23:01) : Head
#4 (14:23:01) : Head
#5 (14:23:01) : Tails
En mode avec doublons, la même entrée peut être tirée plusieurs fois de suite,
et le pool ne diminue jamais. L'horodatage du tirage est ajouté à chaque
enregistrement afin que la même liste de candidats puisse être réutilisée
entre les manches tandis que l'historique indique précisément quand chaque
tirage a eu lieu. L'effacement des enregistrements est indépendant de la
liste de candidats — ils sont stockés sous des clés localStorage différentes.Extrait JavaScript pour la sélection sous-jacente
// Tire un index dans [0, n) avec Web Crypto (CSPRNG)
function pickIndex(n) {
// crypto.getRandomValues fournit une valeur uniforme sur 32 bits ; le modulo n
// est sûr ici car n vaut au plus quelques milliers pour un tirage de liste,
// et le biais du modulo est négligeable (2^32 / n est grand).
const buf = new Uint32Array(1);
crypto.getRandomValues(buf);
return buf[0] % n;
}
// pickIndex(6) -> par ex. 4 (Charlie dans l'exemple ci-dessus)
// pickIndex(2) -> 0 ou 1 (Head ou Tails)
//
// Note : pour des pools énormes où n approche 2^32, utilisez l'échantillonnage
// par rejet pour éliminer le biais du modulo, par exemple :
// const limit = Math.floor(0xFFFFFFFF / n) * n;
// let r; do { crypto.getRandomValues(buf); r = buf[0]; } while (r >= limit);Vérification d'équité sur 1 000 tirages
Liste : ['A', 'B', 'C', 'D'] (4 entrées, part attendue 25,0 %)
Tirages : 1 000 Autoriser les doublons : ON
Observé :
A : 247 (24,7 %)
B : 256 (25,6 %)
C : 248 (24,8 %)
D : 249 (24,9 %)
Un tirage de 1 000 itérations avec crypto.getRandomValues doit rester dans une
fourchette d'environ +/- 3 points de pourcentage par rapport à la part attendue
sur chaque entrée ; des écarts plus importants (par ex. une entrée à 35 %)
indiquent généralement que l'implémentation appelle Math.random() ou applique
mal le modulo. Pour une tombola encadrée, conservez la liste source, la source
de l'entropie (navigateur/OS), l'horodatage du tirage et une signature de témoin
— localStorage n'est pas un système d'enregistrement durable.FAQ
Le tirage est-il vraiment aléatoire ?
Oui. La sélection utilise crypto.getRandomValues de la Web Crypto API, qui est cryptographiquement robuste. Chaque option a une probabilité égale, sauf si vous configurez des pondérations.
La même option peut-elle être tirée deux fois de suite ?
Oui — c'est ainsi que fonctionne une sélection aléatoire indépendante. Avec 5 options, la probabilité d'obtenir deux fois le même résultat consécutivement est de 1/5 = 20 %. Si vous ne voulez pas de répétition, activez « retirer après sélection » qui effectue un tirage sans remise jusqu'à ce que la liste soit vide.
Comment fonctionne le tirage de N éléments ?
Par défaut, le tirage se fait sans remise — chaque élément peut être sélectionné au maximum une fois par tirage de N éléments. Activez « avec remise » si les doublons sont acceptables (par exemple, attribuer N tâches à une seule personne). N ne peut pas dépasser la taille de la liste en mode sans remise.
Puis-je ajouter des pondérations pour biaiser les tirages ?
Certaines versions prennent en charge des pondérations par option (par exemple, option A pondération 3, option B pondération 1 — A est 3 fois plus probable). La page normalise les pondérations en probabilités. Sans pondération, chaque option a une probabilité égale.
Pourquoi est-ce plus équitable qu'un tirage « à l'instinct » ?
Les humains sont mauvais en aléatoire — nous avons tendance à éviter les choix récents, à sur-choisir les options saillantes et à favoriser inconsciemment les noms que nous reconnaissons. Un tirage par ordinateur élimine ce biais, ce qui rend les décisions de type tombola plus claires pour les participants.
Ma liste est-elle enregistrée ?
Certaines versions enregistrent dans localStorage afin que la liste persiste dans le même navigateur. Fermer l'onglet ou changer de navigateur la fait disparaître, sauf si vous l'avez exportée. Rien n'est téléversé.
Puis-je l'utiliser pour des loteries légales ?
Non. Les tombolas, loteries et tirages de jeux d'argent légaux nécessitent des procédures aléatoires auditables, souvent du matériel RNG physique ou certifié. Un outil web généraliste n'est ni documenté ni audité — utilisez-le uniquement pour les tombolas de bureau et les tirages informels.