Génération de nombres aléatoires en C# : du débutant au pro (solution au top sujet Stack Overflow)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment générer un entier aléatoire en C# : on démystifie une bonne fois pour toutes

\n

La 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\n

Cet 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 !

\n\n

Pourquoi les débutants obtiennent-ils toujours le même nombre ?

\n

La 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\n

Que 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.

\n\n

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\n

Maintenant, chaque nombre sera différent. Règle simple : un seul Random par thread d'exécution.

\n\n

Random.Next() : trois façons d'obtenir un entier aléatoire

\n

La classe System.Random propose trois surcharges de la méthode Next(). Voyons chacune avec des exemples :

\n\n

1. Random.Next() — sans paramètres

\n

Retourne un entier non négatif compris entre 0 et Int32.MaxValue - 1, soit de 0 à 2 147 483 646.

\n
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // Exemple : 1789034215\n
\n\n

2. Random.Next(Int32) — avec une limite supérieure

\n

Retourne un nombre de 0 (inclus) jusqu'au maximum spécifié (exclu).

\n
int dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 ou 6\nConsole.WriteLine(dice);\n
\n\n

3. Random.Next(Int32, Int32) — intervalle [min, max)

\n

La 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\n

Important à retenir : la limite supérieure n'est pas incluse. Pour obtenir un nombre de 1 à 6 (comme un dé), écrivez Next(1, 7).

\n\n

Top 3 des erreurs avec Random en C#

\n

En 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 Random sans synchronisation, des bugs et des valeurs nulles peuvent survenir. Utilisez lock ou ThreadLocal<Random>.
  • \n
  • Erreur n°3 : Utiliser Random pour des mots de passe ou des jetons. System.Random est un générateur pseudo-aléatoire. Il est prévisible ! Pour la sécurité, il faut System.Security.Cryptography.RandomNumberGenerator.
  • \n
\n\n

Comment générer des nombres aléatoires cryptographiques ?

Blogs

Book Recommendations