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 #?
Réponses
Trop de publicités?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)); }
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
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)