2008-09-04 8 views

Répondre

60

La seule chose que j'ajouterais à la réponse de Eric est une explication; Je pense que la connaissance de la raison pour laquelle le code fonctionne est meilleure que de savoir quel code fonctionne. L'explication est la suivante: disons que vous voulez un nombre 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 entre 0 et plage.

Donc, cela nous donnerait double au hasard 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 plus petit nombre, 2,5:

2.5 + rng.NextDouble() * 2.0

Maintenant, nous obtenons un nombre entre 0.0 et 2.0; si vous ajoutez 2,5 à chacune de ces valeurs, nous voyons que la plage est maintenant comprise entre 2,5 et 4,5. Au début, je pensais que cela importait si b> a ou a> b, mais si vous travaillez dans les deux sens, vous trouverez que cela fonctionne à l'identique tant que vous ne dérangez pas l'ordre des variables utilisé. Je tiens à exprimer avec des noms de variables plus donc je ne suis pas mêlé:

double NextDouble(Random rng, double min, double max) 
{ 
    return min + (rng.NextDouble() * (max - min)); 
}
2
// generate a random number starting with 5 and less than 15 
Random r = new Random(); 
int num = r.Next(5, 15); 

double: vous pouvez remplacer suivante avec NextDouble

+1

Ce n'est pas réellement précis. NextDouble génère seulement entre 0.0 et 1.0. – Bloodyaugust

+3

NextDouble() ne prend aucun argument de ce que je peux voir. –

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

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

Comment hasard? Si vous pouvez traiter 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 Mersenne Twister. Beaucoup de gens ont already implemented it pour vous si

1

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

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

Pour plus de détails, voir How Random is your Random??" (inspiré par un article CodingHorror sur shuffling pont)

1

Pour une explication des raisons pour lesquelles Longhorn a été downmodded tant: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Recherchez la mise en œuvre de NextDouble et l'explication de ce est un double aléatoire. Ce lien est également un exemple goo de la façon d'utiliser des nombres aléatoires cryptographiques (comme Sameer mentionné) seulement avec des sorties utiles réelles au lieu d'un flux binaire.

Questions connexes