Question

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

Était-ce utile?

La solution

La seule chose que j'ajouterais ÉricLa réponse de est une explication ;Je pense qu’il est préférable de savoir pourquoi le code fonctionne plutôt que de savoir quel code fonctionne.

L'explication est la suivante :disons que vous voulez un nombre compris entre 2,5 et 4,5.La plage est de 2,0 (4,5 - 2,5). NextDouble renvoie uniquement un nombre compris entre 0 et 1,0, mais si vous le multipliez par la plage, vous obtiendrez un nombre compris entre 0 et 1,0. gamme.

Cela nous donnerait donc des doubles aléatoires entre 0,0 et 2,0 :

rng.NextDouble() * 2.0

Mais nous les voulons entre 2,5 et 4,5 !Comment faisons-nous cela?Ajoutez le plus petit nombre, 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 plage se situe désormais entre 2,5 et 4,5.

Au début, je pensais que c'était important si b > a ou a > b, mais si vous travaillez dans les deux sens, vous constaterez que cela fonctionne de manière identique tant que vous ne gâchez pas l'ordre des variables utilisées.J'aime l'exprimer avec des noms de variables plus longs pour ne pas me tromper :

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

Autres conseils

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
// 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

Voici un extrait de la façon d'obtenir des nombres aléatoires cryographiquement sûrs :Cela remplira les 8 octets avec une séquence cryptographiquement forte de valeurs aléatoires.

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

Pour plus de détails, voir À quel point votre aléatoire est-il aléatoire ? » (inspiré d'un article de CodingHorror sur le mélange de decks)

À quel point est-ce aléatoire ?Si vous pouvez gérer le pseudo-aléatoire, alors simplement :

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

Si vous voulez un "meilleur" nombre aléatoire, vous devriez probablement consulter l'algorithme Mersenne Twister.Beaucoup de gens ont je l'ai déjà mis en œuvre pour toi cependant

Pour une explication de la raison pour laquelle Longhorn a été autant downmodé : http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Recherchez l'implémentation de NextDouble et l'explication de ce qu'est un double aléatoire.

Ce lien est également un bon exemple de la façon d'utiliser des nombres aléatoires cryptographiques (comme Sameer l'a mentionné) uniquement avec des sorties réellement utiles au lieu d'un flux binaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top