2335 votes

Comment générer un nombre aléatoire int ?

Comment générer un nombre entier aléatoire en C# ?

2948voto

Guffa Points 308133

Le site Random classe est utilisé pour créer des nombres aléatoires. (Pseudo-aléatoire qui est bien sûr.).

Exemple :

Random rnd = new Random();
int month  = rnd.Next(1, 13);  // creates a number between 1 and 12
int dice   = rnd.Next(1, 7);   // creates a number between 1 and 6
int card   = rnd.Next(52);     // creates a number between 0 and 51

Si vous devez créer plus d'un numéro aléatoire, vous devez conserver le numéro de série de l'option Random instance et la réutiliser. Si vous créez de nouvelles instances trop proches dans le temps, elles produiront la même série de nombres aléatoires car le générateur aléatoire est alimenté par l'horloge du système.

0 votes

Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .

9 votes

Afin de le réutiliser, vous pouvez déclarer rnd comme static et/ou le définir une seule fois lors de l'initialisation du code.

9 votes

@JuniorM : Oui, vous pouvez le rendre statique pour le réutiliser, mais vous devez faire attention à ne pas y accéder depuis plusieurs threads car il n'est pas thread safe (comme c'est le cas pour toute classe qui n'est pas spécifiquement rendue thread safe).

268voto

Pankaj Mishra Points 5377

Chaque fois que vous faites new Random(), il est initialisé . Cela signifie que dans une boucle serrée, vous obtenez la même valeur plusieurs fois. Vous devriez garder une seule instance de Random et continuer à utiliser Next sur cette même instance.

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

6 votes

N'est-ce pas ce que @Guffa a dit dans sa réponse il y a 6 mois ? "Si vous créez de nouvelles instances trop proches dans le temps, elles produiront la même série de nombres aléatoires".

4 votes

@Chris- C'est bien ce que vous avez dit. Dans ce document, j'ai fourni la mise en œuvre de cela. Je pense que c'est une bonne façon de faire. Cela fonctionne mieux.

24 votes

Il s'agit d'une implémentation qui synchronise le code pour une utilisation à partir de plusieurs threads. C'est une bonne chose pour une application multifilière, mais une perte de temps pour une application monofilière.

123voto

Fyodor Soikin Points 7907

Attention new Random() est ensemencé sur l'horodatage actuel.

Si vous voulez générer un seul numéro que vous pouvez utiliser :

new Random().Next( int.MinValue, int.MaxValue )

Pour plus d'informations, consultez le Random classe, mais notez bien :

Cependant, comme l'horloge a une résolution finie, l'utilisation du constructeur sans paramètre pour créer différents objets aléatoires en succession rapprochée crée des générateurs de nombres aléatoires qui produisent des séquences identiques de nombres aléatoires.

N'utilisez donc pas ce code pour générer une série de nombres aléatoires.

42 votes

-1 : La graine par défaut est basée sur le temps ; faites ceci dans une boucle et vous obtiendrez des résultats très peu aléatoires. Vous devriez créer un et l'utiliser pour tous vos numéros, et non un générateur distinct à chaque fois.

24 votes

Hé, c'est injuste. La question était de savoir comment générer un nombre aléatoire int. Aucune boucle ou série n'a été mentionnée.

27 votes

Ok, c'est juste. C'est annulé. Bien que, je pense toujours que ne pas utiliser new Random() dans une boucle est un point important.

72voto

Joren Points 7911
Random r = new Random();
int n = r.Next();

2 votes

Cela semble être une réponse précieuse sous-estimée !

20voto

mbcrump Points 342

Tu pourrais utiliser la méthode de Jon Skeet StaticRandom dans la bibliothèque de classes MiscUtil qu'il a construite pour un nombre pseudo-aléatoire.

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());

33 votes

Je viens de jeter un coup d'oeil au code source, et cette fonction utilise exactement le même moteur de nombres aléatoires, celui "inclus" dans C#, mais s'assure que la même "graine"/"objet mère" est utilisée pour tous les appels. (Je suis désolé de ne pas connaître la terminologie du C#. Mais ce que je veux dire, c'est que cette fonction ne produit pas de meilleurs nombres aléatoires que la fonction standard).

5 votes

Il est impossible que quoi que ce soit soit "vraiment aléatoire", car il y a toujours un facteur limitant ou un préjugé inhérent à son existence même. Tu n'as pas écouté le professeur en cours de sciences ? ;-)

0 votes

Disons que, selon lui, c'est aussi "vraiment aléatoire" que possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X