12
votes

Nombre aléatoire dans une boucle

Avoir un problème générant des nombres aléatoires dans une boucle. Peut se déplacer en utilisant Whlef.sleep mais après une solution plus élégante. XXX

se retrouvera avec 11111 ... 222 ... etc.

suggestions?


4 commentaires

Si cette boucle est supérieure à quelques itérations, vous voudrez abandonner la concaténation de chaînes en faveur d'un objet stringbuilder .


@Anthony: Non, il a besoin d'utiliser plus chaque itération.


@Henk ... évidemment. Pourriez-je suggérer une boucle imbriquée avec plusieurs concatenations d'un seul espace suivi immédiatement en remplaçant l'espace unique avec String.empty.


Voir aussi Stackoverflow.com/questions/767999


5 Réponses :


57
votes

Déplacez la déclaration du générateur de nombres aléatoires hors de la boucle.

La génération de nombres aléatoires commence à partir d'une valeur de graine. Si la même graine est utilisée à plusieurs reprises, la même série de nombres est générée. Un moyen de produire différentes séquences est de rendre la valeur de la graine dépendante du temps, produisant ainsi une série différente avec chaque nouvelle instance de hasard. Par défaut, le constructeur sans paramètre de la classe aléatoire utilise l'horloge système pour générer sa valeur de graine, ...

source < p> En faisant la déclaration dans la boucle, vous appelez efficacement le constructeur de la même valeur et encore, vous obtenez les mêmes numéros.

Donc, votre code devrait donc devenir: xxx


0 commentaires

9
votes
Random r = new Random(); 
for ... 
    string += r.Next(4); 
new Random() will initialize the (pseudo-)random number generator with a seed based on the current date and time. Thus, two instances of Random created at the same date and time will yield the same sequence of numbers.You created a new random number generator in each iteration and then took the first value of that sequence. Since the random number generators were the same, the first value of their sequences was the same. My solution will create one random number generator and then return the first, the second, etc... value of the sequence (which will be different).

0 commentaires

2
votes

Vous devez utiliser la même instance aléatoire tout au lieu de la création d'une nouvelle à chaque fois.

Comme vous l'avez: P>

Random r = new Random()
for ...
    string += r.Next(4);


0 commentaires

2
votes

Déplacer le Random R = Nouveau aléatoire (); en dehors de la boucle et appelez simplement à l'intérieur de la boucle.


3 commentaires

J'aurais dû recharger la page. Lol tout le monde avait la même réponse


La question est "à l'intérieur de la boucle"


@MironLine Peut-être que vous n'avez pas lu la réponse entière, j'adresse aussi de partir "à l'intérieur de la boucle". La réponse acceptée était exactement comme je l'ai décrite, donc je suppose que cela correspond à la demande de l'OP.



6
votes

J'ai trouvé une page en chinois qui disait la même chose avec le temps: http: // godleon.blogspot.hk/2007/12/c.html , il a dit que si vous tapez comme ceci:

aléatoire aléatoire = nouveau aléatoire (guid.newguid (). gethashcode ());

Vous pouvez obtenir un nombre aléatoire même dans une boucle! Cela a également résolu ma question!


6 commentaires

pourquoi le rendre lent, juste guid.newguid (). gethashcode () sera suffisant


@nawfal je ne comprends pas vraiment ce que vous dites ?!!!! N'ai-je pas fait ça?


Je voulais dire guid.newguid (). Gethashcode () sera plus rapide que nouveau aléatoire (guid.newguid (). Gethashcode ()) . Les deux donne des entiers aléatoires


La page en chinois utilise cette méthode particulière consiste à le ralentir de manière à générer des nombres plus aléatoires comme aléatoires utilisés dans une boucle ne disposant pas de suffisamment de temps pour générer.


Au lieu d'utiliser de nouveaux GUIDS HASHCODES, vous pouvez utiliser une nouvelle incrémentation int sans aucun cycle de boucle, ce qui modifiera le paramètre de graines aléatoires dans le constructeur. Cette approche sera plus rapide.


@fragment pourquoi ne pas ajouter votre réponse aussi pour que nous puissions avoir plus de choix :)