L'ensemencement d'un générateur de nombres pseudo-aléatoires en C #
J'ai besoin d'une graine pour une instance de C#'s Random
classe, et j'ai lu que la plupart des gens utilisent à l'heure actuelle de tiques compteur de cette. Mais c'est une valeur 64 bits et de la semence doit être une valeur de 32 bits. Maintenant, j'ai pensé que le GetHashCode()
méthode, qui renvoie un int
devrait raisonnablement distribué valeur de l'objet, et cela peut être utilisé pour éviter d'utiliser seul le bas de la 32-bits du nombre de cycles. Cependant, je ne pouvais pas trouver quelque chose à propos de la GetHashCode() de la Int64
type de données.
Alors, je sais qu'il sera pas beaucoup d'importance, mais les travaux suivants aussi bon que je le pense (je ne peux pas l'essai-et-erreur aléatoire), ou peut-être qu'il fonctionne de la même que l'utilisation de (int)DateTime.Now.Ticks
comme la graine? Ou peut-être même pire? Qui peut jeter quelque lumière sur ce point.
int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
Random r = new Random(seed);
Edit: Pourquoi j'ai besoin d'une graine et de ne pas laisser le Random()
constructeur de faire le travail? J'ai besoin d'envoyer la graine à d'autres clients qui utilisent les mêmes semences pour la même séquence aléatoire.
source d'informationauteur Virtlink
Vous devez vous connecter pour publier un commentaire.
new Random()
utilise déjà l'heure actuelle. Il est équivalent ànew Random(Environment.TickCount)
.Mais c'est un détail d'implémentation et peut changer dans les futures versions de .net
Je vous recommande d'utiliser new Random() et seulement une graine si vous souhaitez obtenir une reproductibilité de la séquence pseudo-aléatoire de valeurs.
Puisque vous avez besoin d'un connu de semences suffit d'utiliser
Environment.TickCount
tout comme MME ne. Et puis la transmettre à d'autres instances de programme en tant que semences.Si vous créez plusieurs instances de
Random
dans un court intervalle (16ms), elles peuvent être semées à la même valeur, et de créer ainsi de la même séquence pseudo-aléatoire. Mais c'est probablement pas un problème ici. Ce piège classique est causé par windows mise à jour de l'heure actuelle(DateTime.Now
/.UtcNow
) et le TickCount(Environment.TickCount
) à seulement quelques millisecondes. L'intervalle exact dépend de la version de windows et sur ce que d'autres programmes sont en cours d'exécution. Typique des intervalles où ils ne changent pas sont 16ms ou de 1ms.Si vous besoin à la graine avec autre chose qu'à l'heure actuelle (dans ce cas vous pouvez utiliser le constructeur par défaut), vous pouvez utiliser ceci:
J'ai eu une question similaire , de sélectionner au hasard un ensemble de questions à partir d'une liste plus large de questions. Mais quand j'utilise le temps comme la semence il donne le même nombre aléatoire .
Voici donc ma solution.