Comment générer un entier aléatoire en C# : on démystifie une bonne fois pour toutes
\nLa génération de nombres aléatoires est l'une des questions les plus posées sur Stack Overflow. Ça a l'air simple, non ? Pourtant, même les développeurs expérimentés en C# commettent des erreurs classiques : obtenir les mêmes valeurs à chaque exécution, faire face à des séquences non aléatoires, ou oublier la sécurité des threads. Aujourd'hui, on va voir une bonne fois pour toutes comment générer correctement des entiers aléatoires en C#, et répondre à tous les « pourquoi » du fameux top Stack Overflow.
\n\nCet article est votre chance d'arrêter de copier-coller du code trouvé sur Internet et de commencer à comprendre ce qui se passe vraiment sous le capot de System.Random. C'est parti !
Pourquoi les débutants obtiennent-ils toujours le même nombre ?
\nLa question la plus fréquente : « Je crée un Random et j'obtiens toujours le même nombre ! ». Regardons ce code piège typique :
\n\n// ❌ MAUVAIS EXEMPLE\nfor (int i = 0; i < 5; i++)\n{\n Random rnd = new Random();\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nQue va afficher ce code ? À 99 %, cinq nombres identiques. Pourquoi ? Parce que Random utilise l'horloge système pour l'initialisation (seed). Quand vous créez plusieurs instances de Random à la suite, elles reçoivent la même « graine », et génèrent donc une séquence identique.
La bonne solution : créer une seule instance de Random et la réutiliser :
\n\n// ✅ BON EXEMPLE\nRandom rnd = new Random();\nfor (int i = 0; i < 5; i++)\n{\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nMaintenant, chaque nombre sera différent. Règle simple : un seul Random par thread d'exécution.
\n\nRandom.Next() : trois façons d'obtenir un entier aléatoire
\nLa classe System.Random propose trois surcharges de la méthode Next(). Voyons chacune avec des exemples :
1. Random.Next() — sans paramètres
\nRetourne un entier non négatif compris entre 0 et Int32.MaxValue - 1, soit de 0 à 2 147 483 646.
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // Exemple : 1789034215\n\n\n2. Random.Next(Int32) — avec une limite supérieure
\nRetourne un nombre de 0 (inclus) jusqu'au maximum spécifié (exclu).
\nint dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 ou 6\nConsole.WriteLine(dice);\n\n\n3. Random.Next(Int32, Int32) — intervalle [min, max)
\nLa variante la plus populaire pour générer un entier aléatoire en C# dans un intervalle donné.
\n// Nombre aléatoire entre 1 et 100 (inclus)\nint score = rnd.Next(1, 101);\nConsole.WriteLine(score);\n\n\nImportant à retenir : la limite supérieure n'est pas incluse. Pour obtenir un nombre de 1 à 6 (comme un dé), écrivez Next(1, 7).
Top 3 des erreurs avec Random en C#
\nEn nous basant sur les vraies questions de Stack Overflow C# random, voici les pièges les plus fréquents :
\n\n- \n
- Erreur n°1 : Créer un nouveau Random dans une boucle. On l'a vu, cela donne des nombres identiques. Solution : placez
new Random()en dehors de la boucle. \n - Erreur n°2 : Random n'est pas thread-safe. Si plusieurs threads utilisent une même instance de
Randomsans synchronisation, des bugs et des valeurs nulles peuvent survenir. UtilisezlockouThreadLocal<Random>. \n - Erreur n°3 : Utiliser Random pour des mots de passe ou des jetons.
System.Randomest un générateur pseudo-aléatoire. Il est prévisible ! Pour la sécurité, il fautSystem.Security.Cryptography.RandomNumberGenerator. \n