Chibuchibs/free-claude-skills

Détecte les mélanges biaisés, les tirages aléatoires truqués et les probabilités trompeuses, et teste correctement les distributions. Utilisez cette compétence dès qu'un code mélange un tableau, randomise des réponses de quiz ou des options, sélectionne un sous-ensemble aléatoire, attribue des probabilités, génère du butin ou des récompenses, ou quand quelqu'un dit que les résultats « semblent truqués », « choisissent toujours la même chose » ou demande comment mélanger ou randomiser quelque chose.

Qu'est-ce que free-claude-skills ?

Cette compétence identifie et corrige un bug de randomisation extrêmement courant en JavaScript : l'utilisation de `Array.sort()` avec un comparateur basé sur `Math.random()`, qui produit des permutations biaisées au lieu d'un véritable mélange uniforme. Elle propose la correction standard Fisher-Yates, explique comment tester la distribution d'un mélange avec des compteurs statistiques, et montre comment vérifier que les probabilités affichées correspondent aux résultats réels du code. La compétence est conçue pour être utilisée dans des environnements comme Claude Code, Cursor ou Codex, et fournit des scripts de test reproductibles ainsi qu'une méthodologie pour éviter les faux positifs (comme les générateurs congruels défectueux). Elle est utile à tout développeur manipulant des tirages aléatoires, des quiz, des systèmes de récompense ou toute interface affichant des pourcentages de chance.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Chibuchibs/free-claude-skills/tree/HEAD/skills/randomness-correctness

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Le mélange qui n'en est pas un

Le bug de randomisation le plus courant en JavaScript :

const shuffled = items.sort(() => Math.random() - 0.5);   // FAUX

Il a l'air correct et on le trouve partout. Ce n'est pas un mélange. Les comparateurs de tri sont censés être cohérents, et celui-ci ne l'est pas, donc le tri du moteur produit des permutations biaisées.

Mesuré sur quatre options de quiz :

PositionProbabilité que la bonne réponse s'y trouve
028,3 %
128,2 %
224,7 %
318,8 %

Une distribution uniforme donnerait 25 % chacun. En pratique, deviner toujours la première option battait le hasard — un joueur qui le remarquait aurait un avantage, et le quiz était discrètement injuste.

La correction

Fisher-Yates, une fois, dans une fonction d'aide :

function shuffle(a) {
  const out = [...a];
  for (let i = out.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [out[i], out[j]] = [out[j], out[i]];
  }
  return out;
}

Ensuite, remplacez chaque occurrence. Le bug apparaît généralement plus d'une fois — une base de code l'avait dans onze endroits : mélange des options de quiz, choix des questions affichées, sélection des articles proposés, ordre des éléments de menu. Chacun biaisait légèrement quelque chose.

Ne remplacez pas en bloc sur une simple correspondance de motif. (Math.random() - 0.5) apparaît aussi légitimement comme bruit en physique ou comme tremblement :

velocity += (Math.random() - 0.5) * 0.012;   // laissez cela tranquille

Vérifiez que chaque occurrence est bien un comparateur de tri.

Tester la distribution

Ne vous fiez pas à une inspection visuelle du hasard. Comptez-le :

const pos = [0,0,0,0], N = 200000;
for (let i = 0; i < N; i++) {
  const order = shuffle(['a','b','c','d'].map((t,i) => [t,i]));
  pos[order.findIndex(o => o[1] === 0)]++;
}
pos.forEach((c,i) => console.log(i, (c/N*100).toFixed(1) + '%'));

Un écart supérieur à environ 3 points de pourcentage entre les positions signifie que quelque chose est biaisé.

Utilisez un générateur correct pour le test. Un générateur congruentiel linéaire artisanal a produit des « erreurs » de 1 à 2 points qui ressemblaient à un vrai bug, mais qui venaient en fait du test lui-même. Math.random() est suffisamment uniforme pour vérifier les distributions — réservez votre générateur personnalisé pour les cas où vous avez besoin de graines reproductibles, et validez-le séparément.

Vérifier les probabilités que vous affichez

Si vous affichez des probabilités quelque part — un pourcentage, une barre de progression, une chance de succès — assurez-vous qu'elles correspondent à ce que le code tire réellement. Simulez le tirage réel plusieurs centaines de milliers de fois et comparez :

cred   0  affiché 5,0 %/40,0 %/55,0 %   réel 5,0 %/40,0 %/55,0 %
cred 100  affiché 40,0 %/40,0 %/20,0 %  réel 40,0 %/40,1 %/20,0 %

Une erreur maximale inférieure à un demi-point de pourcentage signifie que l'affichage ne ment pas. Une probabilité affichée que le résultat ne respecte pas est pire que de n'afficher rien, car les gens prennent des décisions basées sur elle.

Pendant que vous y êtes

Vérifiez qu'un objectif annoncé est réellement atteignable. Un compteur indiquant « 3 sur 5 » dit aux joueurs que 5 est la cible ; si 5 n'arrive que 0,17 % du temps, l'interface promet quelque chose qui n'arrive effectivement jamais. Calculez les véritables probabilités de chaque jalon que vous affichez.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills associés