33 votes

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

Je voudrais générer un nombre à virgule flottante aléatoire entre 2 valeurs. Quelle est la meilleure façon de faire cela en C #?

60voto

OwenP Points 11164

La seule chose que je voudrais ajouter à Eric's réponse est une explication; je sens que la connaissance des raisons pour lesquelles un code qui fonctionne est mieux que de savoir ce que le code fonctionne.

L'explication est ceci: disons que vous voulez un nombre compris entre 2.5 et 4.5. La gamme est 2.0 (4.5 - 2.5). NextDouble seulement renvoie un nombre entre 0 et 1.0, mais si vous multipliez cela par la plage, vous obtiendrez un nombre entre 0 et plage.

Donc, ce serait de nous donner doubles aléatoires compris entre 0.0 et 2.0:

rng.NextDouble() * 2.0

Mais, nous voulons entre 2.5 et 4.5! Comment faisons-nous cela? Ajouter le nombre le plus petit, 2.5:

2.5 + rng.NextDouble() * 2.0

Maintenant, nous obtenons un nombre compris entre 0.0 et 2.0; si vous ajoutez 2,5 à chacune de ces valeurs, nous voyons que la gamme est maintenant entre 2,5 et 4,5.

J'ai d'abord cru que c'était si b > a ou a > b, mais si vous travailler de deux façons vous verrez qu'il fonctionne de manière identique tant que vous n'avez pas gâcher l'ordre des variables utilisées. Je tiens à exprimer avec plus de noms de variables, donc je n'ai pas mélangé:

double NextDouble(rng Random, min double, double max)
{
 retour min + (rng.NextDouble() * (max - min));
}

20voto

Eric Points 5994
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}

2voto

Ryan Farley Points 7916
 // generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);
 

Pour les doubles, vous pouvez remplacer Next par NextDouble

1voto

enigmatic Points 255

Comment aléatoire? Si vous pouvez traiter avec pseudo-aléatoire alors simplement:

 Random randNum = new Random();
randNum. NextDouble(Min, Max);
 

Si vous voulez un "meilleur" nombre aléatoire, alors vous devriez probablement regarder l'algorithme de Mersenne Twister. Beaucoup de gens l'ont déjà mis en place pour vous bien

1voto

Sameer Alibhai Points 794

Voici un extrait de la procédure à suivre pour obtenir des nombres aléatoires sécurisés sur le point de cryptographie: Cette opération remplit les 8 octets avec une séquence de valeurs aléatoires très strictes du point de vue cryptographique.

 byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);
 

Pour plus de détails, voir À quel point votre aléatoire est-elle aléatoire? " (Inspiré d'un article de CodingHorror sur le brassage des ponts)

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