Comment générer un nombre entier aléatoire en C# ?
Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .
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.
Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .
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.
@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).
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);
}
}
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".
@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.
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.
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.
-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.
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.
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.
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());
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).
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 ? ;-)
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.