Méthode correcte de “statique” l'Aléatoire.Suivant en C#?
Pourquoi ai-je besoin de créer une instance de la classe au sort, si je veux créer un nombre aléatoire entre 1 et 100 ....comme
Random rand = new Random();
rand.Next(1,100);
Est-il statique de la fonction de Hasard de classe à faire de même? comme...
Random.Next(1,100);
Je ne veux pas créer une instance inutilement
- Et en conclusion ... ne pas prématurément optimiser 🙂
- Double Possible de Pourquoi le Système.Aléatoire classe non statique?
Vous devez vous connecter pour publier un commentaire.
Il est recommandé de créer une instance unique de
Random
et de l'utiliser tout au long de votre programme, faute de quoi les résultats peuvent ne pas être aussi aléatoire. Ce comportement est encouragé par le pas de la création d'une fonction statique.Vous ne devriez pas vous inquiéter au sujet de "la création d'une instance inutilement", l'impact est négligeable au mieux - c'est le moyen le cadre de travaux.
Copié directement à partir de
Ce n'est pas "inutile", parce que le Hasard de la classe des magasins de l'état interne. Il n'a qu'à assurez-vous que si vous appelez
.Next()
plusieurs fois très rapidement (dans le même ordre de la milliseconde ou tique ou autre), vous ne parvenez toujours pas à obtenir le même nombre.Bien sûr, si ce n'est pas un problème dans votre cas, vous pouvez toujours combiner ces deux lignes de code en un seul:
De MSDN: au Hasard de Classe (Système):
"La génération de nombre aléatoire démarre à partir d'une valeur initiale. Si la même graine est utilisée à plusieurs reprises, la même série de chiffres est généré. Une façon de produire des séquences différentes est de faire la graine valeur dépendant du temps, et de produire ainsi une série différente avec chaque nouvelle instance de Hasard. Par défaut, le constructeur sans paramètre de la classe Aléatoires utilise l'horloge du système pour générer sa valeur de départ, tandis que son constructeur paramétré peut prendre une valeur Int32 sur la base du nombre de tiques dans le temps actuel. Cependant, parce que le temps a fini de résolution, en utilisant le constructeur sans paramètre de créer différents objets au Hasard dans la succession à proximité crée des générateurs de nombres aléatoires que de réaliser des séquences de nombres aléatoires. L'exemple suivant illustre le fait que les deux objets Aléatoires qui sont instanciés dans la succession à proximité de générer un nombre identique de la série de nombres aléatoires..."
Wikipédia explique PRNGs
Vous déjà eu des réponses ici. Juste réitérant la bonne solution:
De sorte que vous pouvez appeler:
tout au long de. Si vous avez strictement besoin d'un vrai apatrides méthode statique pour générer des nombres aléatoires, vous pouvez compter sur un
Guid
.Ça va être un petit peu plus lent, mais peut être beaucoup plus aléatoire que
Random.Next
, au moins à partir de mon expérience.Mais pas:
Inutile de création de l'objet va rendre plus lent, surtout en vertu d'une boucle.
Et jamais:
Non seulement ses plus lent (à l'intérieur d'une boucle), c'est de l'aléatoire... eh bien pas vraiment bon selon moi..
new Random
....Next()
n'est pas thread-safe et pourrait feasably jeter un IndexOutOfRange exception en vertu de l'utilisation concomitante.Pourquoi pas?
Vous devez créer une instance parce que la façon dont les nombres aléatoires sont générés, c'est que les réponses précédentes affecter les réponses. Par défaut, le
new Random()
constructeur utilise le système actuel de temps à la "graine" de la séquence, mais il ne doit pas: vous pouvez passer votre propre numéro si vous le souhaitez. En particulier:Va produire la même séquence de "aléatoire" nombre à chaque fois.
Cela signifie que le
Random
les besoins de la classe de conserver les données d'instance (la réponse précédente, ou "seed") tout autour pour les appels suivants.La meilleure façon de le faire est d'avoir un
ThreadStatic
Random
exemple:Ce prend soin de tout.
Il m'échappe pourquoi l' .NET Framework (et de tout autre cadre sur la terre) ne pas utiliser quelque chose dans cet esprit.
La création d'une nouvelle instance de Hasard, puis de l'appel immédiatement à de multiples reprises, par exemple:
Vous donnera une distribution qui est orientée vers l'extrémité inférieure de la gamme.
Le faisant de cette manière:
Vous donnera une meilleure distribution.
La création d'une courte durée de l'instance en C# est presque gratuit. Ne perdez pas votre temps à vous préoccuper de cela. Vous avez probablement de meilleurs endroits pour chercher la perf ou de la mémoire des gains.
Générateurs de nombres aléatoires doit maintenir l'état afin d'être "aléatoire". Le générateur de nombre aléatoire crée une séquence qui est généré en fonction d'un nombre aléatoire. Le problème est que rien ne dans un ordinateur est réellement aléatoire. La chose la plus proche de l'ordinateur est à portée de main est l'horloge du système, c'est effectivement l'heure à laquelle se déroule le processus. Donc par défaut le courant de comptage de cycles de l'horloge système est utilisé. Si votre demande est assez rapide, alors beaucoup de nombre aléatoire des calculs peut se produire dans le même système de tique. Si le générateur de nombre aléatoire ne maintient pas l'état à tous, il permettra de fournir le même nombre aléatoire à plusieurs reprises (même entrée donne le même résultat). Ce n'est généralement pas ce que vous voulez.
Je connais déjà la réponse, mais je dois dire que je préfère utiliser le pattern singleton dans ce cas.
Vous avez besoin de quelque chose de similaire à ceci si vous voulez que la syntaxe que vous mentionnez.
Cela devrait vous permettre de faire
Random.Next(1,100);
sans avoir à vous soucier de semis.