La première fois que des nombres aléatoires m'ont mordu, c'était sur un projet parallèle de Laravel des années avant que je commence à créer Toolz.dev. J'avais besoin de codes de référence courts, atteints rand() parce qu'il était juste là, et l'a expédié Une semaine plus tard deux utilisateurs avaient le même code Non pas parce que les chances étaient astronomiques, mais parce que j'avais mal compris ce que rand() en fait promis Ce petit embarras m'a appris une leçon que j'ai portée dans chaque outil sur Toolz.dev : " ; random" ; n'est pas une chose Il y a le hasard occasionnel qui convient pour un lancer de dés, et il y a le sérieux aléatoire dont vous avez besoin au moment où une valeur garde quoi que ce soit.
Ce guide est la version longue de ce que j'aurais aimé que quelqu'un me dise à l'époque. Je vais parcourir la façon de générer des nombres aléatoires avec le Générateur de nombres aléatoires sur Toolz.dev, lorsque les ensembles uniques uniquement comptent, pourquoi la source du caractère aléatoire modifie ce pour quoi vous pouvez utiliser la sortie en toute sécurité, et les cas pratiques où je l'atteins pendant la construction.
tl;dr : Un générateur de nombres aléatoires tire des valeurs d'une plage que vous définissez Définissez un minimum et un maximum, choisissez le nombre de nombres que vous souhaitez et choisissez des nombres entiers ou décimaux Activez uniquement l'unique lorsqu'aucune valeur ne peut se répéter, ce que vous souhaitez pour les loteries, les tirages au sort et l'échantillonnage sans remplacement Le générateur Toolz.dev fonctionne entièrement dans votre navigateur et préfère l'API Web Crypto pour son caractère aléatoire, donc rien de ce que vous générez ne quitte jamais votre appareil.
Que fait réellement un générateur de nombres aléatoires ?
Un générateur de nombres aléatoires mappe une source imprévisible de bits sur une plage C'est tout le travail Dans un navigateur la source qui compte est crypto.getRandomValues()ce que l'API Web Cryptography exige pour être cryptographiquement forte - contrairement à Math.random()[TRADUCTION], ce qui ne fait pas une telle promesse Vous lui dites l'intervalle, disons 1 à 100, et il renvoie une valeur de l'intérieur de cet intervalle où, idéalement, chaque valeur a une chance égale d'en demander plus d'un et il répète le tirage.
La partie intéressante est le mot " ; imprévisible," ; car les ordinateurs sont des machines déterministes qui ne produisent pas naturellement la surprise Ce qu'ils produisent est la pseudo-aléatoire : une séquence qui a l'air aléatoire et passe des tests statistiques mais qui est générée par un algorithme à partir d'une graine de départ Donnez au même algorithme la même graine et vous obtenez la même séquence à chaque fois Cette reproductibilité est une caractéristique lorsque vous écrivez un test qui doit être répétable, et un handicap lorsque vous frappez quelque chose qui doit être incontestable.
Sur Toolz.dev, le générateur se trouve dans le navigateur et lit ses bits crypto.getRandomValues Lorsque le navigateur l'expose, ce que fait chaque navigateur moderne Cette fonction est définie par l'API W3 C Web Cryptography et est adossée au système d'exploitation' ; s source cryptographiquement sécurisée Lorsque cette source est présente, les nombres sont suffisamment imprévisibles pour un travail de sécurité adjacent comme le choix de jetons ou le mélange d'un deck Lorsqu'il est en quelque sorte indisponible, l'outil retombe sur le générateur JavaScript standard, ce qui est bien pour les jeux et l'échantillonnage mais ne devrait jamais semer quoi que ce soit de secret Savoir dans lequel de ces deux mondes vous êtes est la chose la plus importante concernant l'utilisation de tout RNG bien.
Comment générer des nombres aléatoires sur Toolz.dev ?
Le flux est délibérément court car la plupart du temps, vous voulez juste un nombre et vous le voulez maintenant.
Tout d'abord, définissez la plage Entrez le minimum et le maximum Pour les entiers, la plage est incluse aux deux extrémités, donc 1 à 6 peut renvoyer n'importe lequel de 1, 2, 3, 4, 5 ou 6, exactement comme un dé. Les valeurs négatives et les plages qui s'étendent sur zéro, telles que -50 à 50, fonctionnent de la même manière.
Deuxièmement, choisissez le nombre de nombres que vous voulez Un nombre pour une sélection rapide, ou un lot de dix mille maximum lorsque vous ensemencez des données de test ou que vous construisez un échantillon.
Troisièmement, choisissez les options Laisser & devis ; entiers seulement" ; allumé pour les nombres entiers, ou éteignez-le et définissez le nombre de décimales lorsque vous avez besoin de valeurs fractionnaires Allumez " ; valeurs uniques seulement" ; quand aucun nombre ne peut se répéter.
Enfin, cliquez sur Générer Le résultat affiche la liste ainsi que la somme et la moyenne, et l'ensemble du lot copie comme une liste séparée par une nouvelle ligne afin qu'il tombe directement dans une colonne de feuille de calcul, un script ou un luminaire de test Si vous avez utilisé le Générateur UUID ou le générateur de mots de passe sur Toolz.dev, la forme de celui-ci me semblera familière, car j'essaie de garder les générateurs cohérents.
Quand dois-je utiliser des numéros uniques uniquement ?
C'est l'option qui manque aux gens, et c'est celle qui change le plus les maths.
Par défaut le générateur dessine avec remplacement Chaque tirage est indépendant, donc un nombre peut apparaître plus d'une fois dans le même lot C'est correct pour lancer des dés, car une vraie paire de dés peut absolument arriver avec deux quatre Mais c'est faux pour un tirage de loterie, un tirage au sort, ou n'importe quand vous choisissez un échantillon sans remettre le jeton dans le sac.
Activez uniquement unique et le générateur dessine sans remplacement Il conserve un enregistrement de ce qu'il a déjà produit et saute les répétitions jusqu'à ce qu'il ait rempli votre lot L'utilisation classique est les numéros de loterie : si vous voulez six numéros de 1 à 49 sans doublons, unique-seulement est la différence entre un ticket valide et un cassé.
Il y a une limite naturelle ici, et l'outil la respecte Vous ne pouvez pas dessiner plus d'entiers uniques que la plage ne peut contenir Demandez dix nombres uniques entre 1 et 5 et il n'y a pas de réponse valide, car seuls cinq entiers distincts existent dans cet intervalle Plutôt que de tourner pour toujours en essayant de trouver une sixième valeur impossible, le générateur s'arrête et vous dit que la plage est trop petite J'ai construit cette garde exprès après avoir regardé trop de boucles de mélange naïves accrocher dans le code de production.
Intégres ou décimales : de quoi ai-je besoin ?
Les entiers couvrent la plupart des demandes Les dés, les boules de loterie, les indices de tableau et le nombre d'enregistrements sont tous des nombres entiers, et le mode entier vous offre une plage inclusive qui correspond à la façon dont les gens pensent à ces choses.
Les décimales sont pour des quantités continues : un prix aléatoire, une lecture de capteur simulée, un poids, une probabilité Désactivez le mode entier et l'outil tire de l'intervalle semi-ouvert qui comprend le minimum mais pas le maximum Cette convention semi-ouverte, minimum inclus et maximum exclu, est la même que celle qui sous-tend presque tous les RNG à virgule flottante dans chaque langage, y compris JavaScript' ; propre Math.random1, qui renvoie une valeur comprise entre 0 et 1 inclus. La correspondance de cette convention signifie que les nombres que vous obtenez ici se comportent comme les nombres que vous obtiendriez dans le code.
Vous contrôlez également le nombre de décimales, de un à dix Deux places est juste pour les valeurs de type monnaie, plus quand vous simulez des mesures qui ont besoin d'une résolution plus fine Gardez à l'esprit que unique-seulement plus décimales est presque toujours satisfiable parce que l'espace des décimales distinctes est énorme, alors que unique-seulement plus une minuscule plage entière est l'endroit où vous frappez le mur décrit ci-dessus.
Dans quelle mesure " ; est-il suffisamment aléatoire" ; ?
Voici le tableau que j'aurais aimé voir avant cet incident de code de référence Il mappe les cas d'utilisation courante au genre de hasard qu'ils exigent réellement.
| cas d'utilisation | Aléatoire nécessaire | Répétitions autorisées? | notes |
|---|---|---|---|
| Dés, jeux de société | Le pseudo-aléatoire, c'est bien | oui | L’indépendance par rouleau est le point |
| Choisir un gagnant aléatoire | Cryptographique préféré | Non (uniquement) | L'équité compte, utilisez uniquement un usage unique |
| Numéros de loterie ou de tombola | Cryptographique préféré | Non (uniquement) | Dessiner sans remplacement |
| Lignes d'échantillonnage pour analyse | Le pseudo-aléatoire, c'est bien | généralement non | Unique uniquement pour l'échantillonnage sans remplacement |
| Montages d'essai d'ensemencement | Le pseudo-aléatoire, c'est bien | oui | La reproductibilité peut même être souhaitable |
| Tokens de sécurité, secrets | Cryptographique nécessaire | non | N'utilisez jamais de PRNG simple ici |
La ligne qui déclenche les gens est " ; jetons de sécurité." ; Un RNG à usage général, même bon, ne remplace pas un générateur de secrets spécialement conçu. Si vous créez une clé API, un jeton de session ou un mot de passe, utilisez un outil conçu pour ce travail, comme le générateur de mots de passe(ou) un outil de hachage comme le générateur de hachage lorsque vous avez besoin d'un résumé de longueur fixe Le générateur de nombres aléatoires est destiné aux nombres dans une plage, pas au matériel de clé cryptographique, et le cadrage honnête de cette limite est plus utile que de prétendre qu'un outil fait tout.
Que puis-je réellement construire avec ?
Quelques-unes des façons dont cela gagne sa place dans mon flux de travail.
Lorsque je teste une interface utilisateur qui restitue des listes, je génère un lot de quelques centaines de nombres pour remplacer des quantités, des prix ou des scores, les coller dans un luminaire, et soudain la mise en page s'exerce avec une variété réaliste au lieu des trois mêmes lignes. lignes typées à la main Pour les travaux WordPress sur WP Adminify, j'ai utilisé des valeurs aléatoires pour remplir le contenu de la démo afin qu'un écran de paramètres semble vivant dans une capture d'écran.
Lorsqu'un client exécute un cadeau, le mode unique uniquement sélectionne les gagnants de manière équitable à partir d'une liste numérotée de participants Attribuez un numéro à chaque participant, dessinez autant de gagnants uniques qu'il y a de prix, fait Pas de formule de tableur, pas de débat sur la question de savoir si le tirage a été truqué, parce que les chiffres provenaient d'une source qu'aucun de nous ne contrôle.
Pour une intuition statistique rapide, générer un lot important et jeter un coup d'œil à la somme et à la moyenne est un contrôle rapide de la raison que la portée et la distribution se comportent Si je demande des nombres de 1 à 100 et que la moyenne revient près de 50, le monde est comme prévu.
Et pour le quotidien, c'est un rouleau à dés, un tirage au sort quand on traite 1 et 2 comme des têtes et des queues, et un " ; cueillir un numéro" ; colon de petits arguments Toutes les utilisations ne doivent pas nécessairement être sérieuses pour être utiles.
Comment cela se compare-t-il à l'écriture de la vôtre ?
Tu pourrais écrire Math.floor(Math.random() * (max - min + 1)) + min et sois fait J'ai écrit cette ligne mille fois Alors pourquoi chercher un outil ?
Deux raisons, toutes deux apprises à la dure La première est les erreurs off-by-one et modulo-bias qui s'insinuent dans les mathématiques de gamme roulées à la main, surtout une fois que vous ajoutez la limite inclusive contre exclusive et l'exigence unique-seulement L'outil gère les cas de bord, y compris le " ; vous avez demandé plus de valeurs uniques que exis" ; cas, donc vous ne les redécouvrez pas à 2 h. La seconde est que Math.random n'est explicitement pas sécurisé cryptographiquement, un fait que la documentation MDN indique clairement, et il est facile d'oublier que lorsque vous collez un extrait dans du code qui garde plus tard quelque chose de réel Le générateur Toolz.dev est par défaut la source crypto, donc le comportement le plus sûr est celui que vous obtenez sans y penser.
Pour un numéro unique dans un environnement que vous contrôlez, un extrait convient. Pour les tirages répétables, les ensembles uniques, les lots que vous souhaitez copier ou tout ce que vous souhaitez par défaut, la source cryptographique, l'outil enregistre les parties fictives.
Si votre travail penche davantage vers l'encodage et le formatage que vers la génération de nombres, la même philosophie côté client traverse le reste de la boîte à outils, à partir du Lorem Ipsum générateur de texte d'espace réservé vers l'ensemble plus large couvert dans le Outils de productivité des développeurs guide. Et parce que chacun d'entre eux fonctionne localement, le confidentialité des données l'histoire est la même dans chacun d'eux : vos entrées restent dans votre navigateur.
Quelles sont les erreurs courantes que les gens commettent avec les nombres aléatoires ?
Après des années passées à examiner le code, le mien et d'autres personnes' ; s, la même poignée d'erreurs se manifestent encore et encore, et elles valent la peine d'être nommées pour que vous puissiez les éviter.
Le premier est déroutant " ; improbable" ; avec " ; impossible." ; Mon histoire de code de référence est exactement celle-ci Lorsque vous dessinez avec remplacement à partir d'une plage, les collisions ne sont pas un bug, elles sont une certitude statistique étant donné suffisamment de tirages Le paradoxe de l'anniversaire est l'illustration classique : dans un groupe de seulement 23 personnes, la chance que deux personnes partagent un anniversaire est supérieure à 50 pour cent, bien supérieure à ce que suggère l'intuition, car vous comparez chaque paire, ne comparez pas tout le monde à une date fixe Si vos valeurs doivent être uniques, n'espérez pas que la plage soit assez grande. Activez-seu-seu-seu-seu-se-se-se-se-et supprimez le doute.
La seconde consiste à rechercher la mauvaise source. De nombreux didacticiels montrent une formule de gamme construite sur Math.random et ne mentionnez jamais qu'il ne convient à rien de sensible à la sécurité La valeur semble aléatoire, la démo fonctionne et l'habitude s'en tient Puis quelqu'un copie qui snippet dans le code qui génère un jeton de réinitialisation de mot de passe, et maintenant le jeton " ; random" ; est prévisible pour quiconque comprend l'algorithme sous-jacent La règle est contondante : si un humain ne doit jamais être capable de deviner la valeur, il a besoin d'une source cryptographique Le générateur Toolz.dev fait défaut sur cette source, ce qui est la valeur par défaut la plus sûre pour construire une habitude autour.
Le troisième est les erreurs hors-par-un aux limites de la plage Les points de terminaison inclusifs versus exclusifs font trébucher même les développeurs expérimentés, car différents langages et différentes fonctions font des choix différents 100 est-il une sortie possible lorsque je demande 1 à 100 ? pour les entiers ici, oui, les deux extrémités sont incluses Pour les décimales le maximum est exclu, correspondant à la convention à virgule flottante Être explicite sur quelle convention s'applique empêche le bug silencieux où vos dés ne lancent jamais un six parce que vous avez écrit < max au lieu de <= max.
La quatrième est de supposer qu'un petit échantillon semble aléatoire Le vrai hasard produit des amas et des stries Retournez une pièce équitable dix fois et une série de quatre têtes est tout à fait normale, pourtant les gens la voient et supposent que la pièce, ou le générateur, est cassé Le hasard n'est pas la même chose que l'espacement pair Si vous voulez des valeurs uniformément espacées, vous ne voulez pas du tout un générateur de nombres aléatoires, vous voulez une séquence Savoir lequel vous avez réellement besoin est la moitié de la bataille.
Questions fréquentes
Comment fonctionne un générateur de nombres aléatoires ?
Un générateur de nombres aléatoires mappe une source imprévisible de bits sur la plage que vous choisissez Cet outil lit les octets de l'API Web Crypto lorsqu'elle est disponible et les met à l'échelle dans votre intervalle minimum à maximum, de sorte que chaque valeur de la plage a une chance égale d'être tirée.
Les chiffres sont-ils vraiment aléatoires ?
Ce sont des nombres pseudo-aléatoires cryptographiquement forts, imprévisibles à toutes fins pratiques Lorsque le navigateur expose crypto.getRandomValues la sortie est adaptée aux jetons et au brassage ; si seul le générateur standard est disponible les valeurs sont toujours bien distribuées mais ne doivent pas être utilisées pour les secrets.
Comment générer des nombres aléatoires uniques sans répétition ?
Activez l'option unique uniquement avant de générer L'outil dessine alors sans remplacement, donc chaque nombre du lot est différent Si vous demandez plus d'entiers uniques que la plage ne peut contenir, il vous indique au lieu de boucler pour toujours.
Peut-il générer des nombres décimaux ?
Oui. Désactivez l'option entière et définissez le nombre de décimales souhaitées. Les décimales sont tirées de l'intervalle semi-ouvert qui inclut le minimum mais pas le maximum, qui est la convention standard pour les plages continues.
Puis-je utiliser des nombres négatifs ?
Oui. Entrez un minimum négatif, un maximum négatif ou une plage qui s'étend sur zéro, comme -50 à 50. Le générateur gère les plages négatives et mixtes de la même manière qu'il gère les plages positives.
Combien de nombres puis-je générer en même temps ?
Jusqu'à 10 000 numéros par lot Le résultat inclut la somme et la moyenne afin que vous puissiez vérifier la santé mentale des gros lots en un coup d'œil, et toute la liste se copie sous forme de valeurs séparées par de nouvelles lignes.
Ce générateur de nombres aléatoires est-il gratuit et privé ?
Oui. Il est gratuit sans inscription ni plafond d'utilisation, et chaque numéro est généré dans votre navigateur Aucune plage, compte ou résultat n'est jamais transmis à un serveur.
À quoi puis-je utiliser un générateur de nombres aléatoires ?
Les utilisations courantes incluent le choix des numéros de loterie ou de tombola, le lancer de dés pour les jeux, le choix d'un gagnant aléatoire, le classement des données de test, l'échantillonnage des lignes pour l'analyse et la randomisation de l'ordre d'un mode unique uniquement couvre tout cas nécessitant un échantillonnage sans répétition.



