2010-06-20 8 views
-1

i utilisernombres aléatoires dans C#

Random rnd = new Random(); 
x=rnd.Next(10); 

mais chaque fois que je le même nombre. comment y remédier et obtenir des numéros différents? Dites-moi la méthode facile.

merci. Désolé pour mon mauvais anglais.

+0

possible duplication de [Générateur de nombres aléatoires à générer un seul numéro aléatoire] (http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) –

Répondre

-2

Assurez-vous que vous utilisez le constructeur qu'une seule fois. Vous pouvez ajouter une graine.

Random rnd = new Random(DateTime.Now.Millisecond); 

Ensuite, vous pouvez appeler comme vous l'avez fait.

x=rnd.Next(10); 

Mais assurez-vous que vous n'avez pas le constructeur et l'appel à la méthode suivante() dans une boucle ou quelque chose de similaire ...

+5

C'est une mauvaise graine. Vous en avez seulement 1000 séquences différentes, dont l'une commence par 0 (ce qui est une graine * très * médiocre pour la plupart des PRNG [à l'exception des générateurs WELL, mais même alors]).La valeur par défaut pour 'Random' est le nombre actuel de ticks, ce qui est beaucoup mieux que cela, mais vous pouvez toujours obtenir la même séquence si vous créez trop rapidement de nouvelles instances. Le vrai problème est probablement qu'ils créent une nouvelle instance 'Random' encore et encore dans une boucle. – Joey

+0

@Jonathan Je pense que vous avez confondu 'DateTime.Millisecond' (qui est toujours entre 0 et 999) et donc extrêmement mauvais avec' TimeSpan.TotalMilliseconds'. Ce dernier est à peu près aussi bon que la graine par défaut (millisecondes depuis le démarrage) – CodesInChaos

+0

C'est toujours une mauvaise graine, car une ms est longue en termes d'ordinateur (et devient "plus longue" car les ordinateurs continuent à devenir plus rapides). Selon le travail en cours, par exemple si un processus externe le fait et que ce processus est appelé rapidement, il peut réutiliser une graine. – Lucero

13

Le constructeur par défaut de Random utilise l'heure actuelle comme germe. Par conséquent, si vous initialisez plusieurs objets aléatoires en succession rapide (comme dans une boucle, par exemple), ils partageront la même graine.

Créez votre objet aléatoire une fois et utilisez-le plusieurs fois, ou créez une graine à l'avance et utilisez-le pour initialiser vos générateurs.

+2

Dans la grande majorité des cas, créer une instance statique 'Random' et l'utiliser aussi longtemps que dure le programme est la bonne façon de procéder. Si vous avez besoin de plus, vous en savez probablement assez sur les PRNG pour éviter les erreurs courantes. – Joey

+1

Créez un seul objet Random, puis utilisez-le plusieurs fois au lieu d'en créer un nouveau à chaque fois. En outre, System.Random ne doit pas ** être ** utilisé pour tout ce qui concerne la sécurité. Pour cela vous devez utiliser RNGCryptoServiceProvider (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx) – Eadwacer

0

référence obligatoire XKCD:

http://xkcd.com/221/

+4

* sigh * ... Même si c'était encore drôle la vingtième fois que vous Il faut voir cette culture en relation avec des nombres (pseudo) aléatoires ... ce n'est pas une réponse à la question, ni particulièrement utile. – Joey

+0

aussi, http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif est beaucoup plus pertinent – balpha

+1

C'est l'autre qui apparaît fréquemment , quoique légèrement moins. Pourtant, les deux sont peu susceptibles d'aider quelqu'un et ne servent qu'à divertir un petit nombre. – Joey

Questions connexes