Comment puis-je générer un random int nombre?
Comment puis-je générer un nombre entier aléatoire en C#?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je générer un nombre entier aléatoire en C#?
Vous devez vous connecter pour publier un commentaire.
La
au Hasard
de la classe est utilisé pour créer des nombres aléatoires. (Pseudo-aléatoires, c'est bien sûr.).Exemple:
Si vous allez créer plus d'un nombre aléatoire, vous devez garder la
Random
instance et de la réutiliser. Si vous créez de nouveaux cas, trop proche dans le temps, ils vont produire la même série de nombres aléatoires comme le générateur aléatoire est ensemencée à partir de l'horloge système.rnd
commestatic
et/ou de fixer une seule fois lors de l'initialisation du code.Random
...Random
là pour faire de votre aléatoires-ness plus robuste: ericlippert.com/2019/02/04/fixing-random-part-2 et codeblog.jonskeet.royaume-uni/2009/11/04/revoir-aléatoire .La question semble très simple, mais la réponse est un peu compliqué. Si vous voyez presque tout le monde a suggéré d'utiliser le Hasard de classe et certains ont suggéré d'utiliser le RNG crypto classe. Mais alors, quand à choisir ce.
Pour cela nous avons besoin de comprendre d'abord le terme de l'ALÉATOIRE et de la philosophie qui est derrière.
Je vous encourage à regarder cette vidéo qui va en profondeur dans la philosophie de l'ALÉATOIRE à l'aide de C# https://www.youtube.com/watch?v=tCYxc-2-3fY
Première chose que nous devons comprendre la philosophie de l'ALÉATOIRE. Quand nous disons d'une personne à choisir entre le ROUGE, le VERT et le JAUNE ce qui se passe en interne. Ce qui rend une personne de choisir le ROUGE ou le JAUNE ou le VERT?
Une première pensée va dans le personnes d'esprit qui décide de son choix, il peut être de couleur préférée , la chance couleur et ainsi de suite. En d'autres mots, certains de déclenchement initial qui nous terme ALÉATOIRE en tant que SEMENCES.Cette GRAINE est le point de départ, l'élément déclencheur qui lui provoque pour sélectionner la valeur ALÉATOIRE.
Maintenant, si une GRAINE est facile de deviner alors ce genre de nombres aléatoires sont désignées comme des PSEUDO et quand une graine est difficile à deviner ces nombres aléatoires sont appelés SÉCURISÉ nombres aléatoires.
Par exemple une personne qui choisit est de couleur en fonction de la météo et de la bonne combinaison, alors il serait difficile de deviner la graine initiale.
Maintenant, permettez-moi de faire une déclaration importante:-
*“Aléatoire” de la classe ne génère que de nombre PSEUDO-aléatoire, et pour générer des nombres aléatoires avec sécurité, nous devons utiliser “RNGCryptoServiceProvider” de la classe.
Aléatoire de la classe prend les valeurs de départ de votre horloge du CPU qui est très prévisible. Donc, en d'autres mots ALÉATOIRES classe de C# génère pseudo-aléatoire de nombres , ci-dessous est le code pour le même.
**Note: **
.NET Core 2.0.0+
utilise une autre semence sur le constructeur sans paramètre: la place de l'horloge du PROCESSEUR, il utiliseGuid.NewGuid().GetHashCode()
.Tandis que le
RNGCryptoServiceProvider
classe utilise l'OS de l'entropie à générer des graines. OS entropie est une valeur aléatoire qui est généré en utilisant le son, clic de souris, de clavier et de timings, thermique temp etc. Ci-dessous est le code pour le même.À comprendre OS entropie voir cette vidéo à partir de 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY où la logique de l'OS de l'entropie est expliqué. Afin de mettre en mots simples RNG Crypto génère SÉCURISÉ nombres aléatoires.
RandomNumberGenerator.Create()
au lieu d'appeler le constructeur deRNGCryptoServiceProvider
puisqu'il n'est pas disponible sur toutes les plateformes.Chaque fois que vous faites new Random() il est initialisé . Cela signifie que dans une boucle serrée, vous obtenez la même valeur beaucoup de temps. Vous devez garder une seule instance Aléatoire et continuer à l'utiliser Suivant sur la même instance.
Random
objet. Dans les deux cas, j'ai eu le même nombre aléatoire. Avec l'approche de Pankaj il n'est pas arrivé. C'est peut-être au hasard, mais j'en doute maintenant. Je suis d'interrogation pour le nombre aléatoire dans la même seconde à partir de threads différents.Attention,
new Random()
est ensemencée sur le timestamp actuel.Si vous voulez générer des juste un numéro vous pouvez utiliser:
new Random().Next( int.MinValue, int.MaxValue )
Pour plus d'informations, regardez la Aléatoire classe, mais s'il vous plaît note:
Afin de ne pas utiliser ce code pour générer une série de nombre aléatoire.
new Random()
dans une boucle est un point important.Je voulais ajouter un cryptographique sécurisé version:
RNGCryptoServiceProvider Classe (MSDN ou dotnetperls)
Il met en œuvre IDisposable.
Vous pouvez utiliser Jon Skeet est StaticRandom méthode à l'intérieur de la MiscUtil la bibliothèque de la classe qu'il a construit pour un nombre pseudo-aléatoire.
il est préférable de semer l'objet d'Aléatoire avec courant millisecondes, afin de garantir le véritable nombre aléatoire, et vous êtes presque sur de ne pas rechercher les doublons utiliser à de nombreuses reprises
Mise à jour
Je sais que
new Random()
utilise le courant tiques comme les semences, mais les semis avec courant millisecondes est encore assez bon comme c'est un bon début aléatoireLe dernier point est que vous n'avez pas à initialiser
new Random()
chaque fois que vous avez besoin d'un nombre aléatoire, lancer un objet au Hasard, puis l'utiliser autant de fois que vous avez besoin à l'intérieur d'une boucle ou quoi quenew Random()
utilise le courant tiques en tant que semences. Lorsque vous instanciez plusieurs instances au sein de la même milliseconde (par opposition à cocher), puis vous obtiendrez la même valeur retournée.J'ai essayé toutes ces solutions à l'exclusion de la COBOL réponse... lol
Aucune de ces solutions ont été assez bon. J'avais besoin de randoms dans un fast pour int boucle et je recevais des tonnes de valeurs en double, même dans de très larges gammes. Après décantation pour une sorte de hasard résultats trop longtemps, j'ai décidé d'enfin s'attaquer à ce problème une fois pour toutes.
Il est tout au sujet de la graine.
- Je créer un nombre entier aléatoire par l'analyse de la non-chiffres de Guid, puis-je l'utiliser pour instancier ma classe Aléatoires.
Mise à jour: Semis n'est pas nécessaire si vous instancier la classe au sort une fois. De sorte qu'il serait préférable de créer une classe statique et appeler une méthode de ça.
Ensuite, vous pouvez utiliser la classe statique comme c'est le cas..
J'avoue que j'aime cette approche mieux.
Modifié réponse de ici.
Si vous avez accès à un processeur Intel Secure Key PROCESSEUR compatible, vous pouvez générer de vrais nombres aléatoires et les chaînes de caractères à l'aide de ces bibliothèques: https://github.com/JebteK/RdRand et https://www.rdrand.com/
Il suffit de télécharger la dernière version de ici, comprennent Jebtek.RdRand et les ajouter à l'aide d'instruction pour elle. Ensuite, tout ce que vous devez faire est ceci:
Si vous n'avez pas un CPU compatible pour exécuter le code, il suffit d'utiliser les services RESTful à rdrand.com. Avec le RdRandom bibliothèque d'encapsulation inclus dans votre projet, vous n'avez qu'à le faire (vous obtenez 1000 appels gratuits lorsque vous vous inscrivez):
Le nombre généré par la fonction intégrée de
Random
classe (Système d'.Aléatoire) génère des pseudo-aléatoire de nombres.Si vous voulez de vrais nombres aléatoires, le plus proche que l'on peut obtenir est de "sécuriser le Générateur Pseudo-Aléatoire" qui peut être généré en utilisant le Chiffrement des classes en C# comme
RNGCryptoServiceProvider
.Même ainsi, si vous avez encore besoin vrai nombres aléatoires, vous aurez besoin d'utiliser une source externe comme par exemple les produits de comptabilité de la désintégration radioactive comme une graine pour un générateur de nombre aléatoire. Puisque, par définition, un nombre généré par purement algorithmique ne peut être vraiment au hasard.
Je utiliser le code ci-dessous pour avoir un nombre aléatoire:
C'est la classe que j'utilise. Fonctionne comme
RandomNumber.GenerateRandom(1, 666)
Alors que ce n'est pas grave:
Vous voulez le contrôle de la limite (min et max mumbers) la plupart du temps. Donc, vous devez spécifier où le nombre aléatoire commence et se termine.
La
Next()
méthode accepte deux paramètres, min et max.Donc, si je veux que mon nombre aléatoire entre 5 et 15 ans, je venais de faire
Pour fort aléatoire, j'ai toujours utiliser CryptoRNG et pas de Temps.
Chiffres calculés par un ordinateur par le biais d'un processus déterministe, ne peut pas, par définition, être aléatoire.
Si vous voulez un véritable nombres au hasard, le hasard vient de bruit atmosphérique ou de la désintégration radioactive.
Vous pouvez essayer par exemple RANDOM.ORG (il réduit les performances)
Je voulais montrer ce qui se passe quand un nouveau générateur aléatoire est utilisé à chaque fois. Supposons que vous avez deux méthodes ou deux classes, chacun nécessitant un nombre aléatoire. Et naïvement, vous code comme:
Pensez-vous, vous obtiendrez deux Identifiants différents? NAN
La solution est de toujours utiliser un seul statique générateur aléatoire. Comme ceci:
RNGCryptoServiceProvider
est mieux appeler de toute façon.Y mettre tout ce que vous voulez dans le second, entre parenthèses
assurez-vous d'avoir mis un nom en écrivant prop et double onglet pour générer le code
Le code suivant renvoie un nombre aléatoire.
Le code suivant renvoie un nombre aléatoire inférieur à 1000.
Le code suivant renvoie un nombre aléatoire entre le min et le max de la gamme.
Générer random la entre les deux chiffres:
Juste une remarque pour référence future.
Si vous êtes en utilisant .NET de Base, plusieurs instances Aléatoires n'est pas aussi dangereux qu'avant. Je suis conscient que cette question est à partir de 2010, mais depuis que cette question est ancienne mais a une certaine attirance, je pense que c'est une bonne chose pour montrer le changement.
Vous pouvez vous référer à cette question j'ai fait il y a quelques semaines:
Microsoft n'changement Aléatoire par défaut de la graine?
En gros, ils ont changé la valeur par défaut de la graine de
Environment.TickCount
àGuid.NewGuid().GetHashCode()
, donc, si vous créez de 2 instances de Hasard, il n'affichera pas les mêmes chiffres.Vous pouvez voir le fichier diff de .NET Framework/.NET de Base (2.0.0+) ici: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d
Il n'est pas aussi sûr que RNGCryptoServiceProvider, mais au moins il ne vous donnera pas des résultats bizarres.
Je suppose que vous souhaitez distribuées uniformément générateur de nombre aléatoire comme ci-dessous. Nombre aléatoire dans la plupart des langages de programmation, notamment en C# et C++ n'est pas bien mélangé avant de les utiliser. Cela signifie que vous obtiendrez le même nombre, ce qui n'est pas vraiment aléatoire. Pour éviter de dessiner le même nombre, vous avez besoin d'une graine. Généralement, les tiques dans le temps est ok pour cette tâche. N'oubliez pas que vous obtiendrez le même nombre si vous utilisez le même semences à chaque fois. Donc, essayez d'utiliser les diverses graines de toujours. Le temps est une bonne source pour les semences parce qu'ils chage toujours.
si vous êtes à la recherche pour le générateur de nombres aléatoires de distribution normale, vous pouvez utiliser un de Box-Muller transformation. Vérifiez la réponse par yoyoyoyosef Aléatoire Gaussienne de la Variable Concernée. Puisque vous voulez entier, vous avez à jeter le double de la valeur de nombre entier à la fin.
Aléatoire Gaussien Variables
Désolé, OP exige en effet d'un hasard
int
valeur, mais pour le simple but de partager des connaissances si vous voulez un hasardBigInteger
valeur, vous pouvez utiliser l'instruction suivante:Vous pouvez essayer avec la valeur de départ aléatoire à l'aide ci-dessous:
La façon la plus simple est probablement juste
Random.range(1, 3)
Ce serait de générer un nombre entre 1 et 2.Si vous voulez un CSRNG pour générer des nombres aléatoires entre un min et max, c'est pour vous. Il va initialiser
Random
classes sécurisé des germes aléatoires.Pourquoi ne pas utiliser
int randomNumber = Random.Range(start_range, end_range)
?Essayez ces étapes simples pour créer des nombres aléatoires:
Créer de la fonction:
Utiliser la fonction ci-dessus dans un emplacement où vous souhaitez utiliser des nombres aléatoires. Supposons que vous voulez l'utiliser dans une zone de texte.
0 min et 999 est de max. Vous pouvez modifier les valeurs de ce que vous voulez.
Rapide et facile en ligne, utilisez le soufflet code:
Utiliser une instance de manière Aléatoire à plusieurs reprises
Cet article jette un coup d'oeil à pourquoi aléatoire provoque beaucoup de problèmes, et la façon de les aborder.
http://csharpindepth.com/Articles/Chapter12/Random.aspx
Random
n'est pas thread-safe de la classe. Si vous créez une instance unique, vous devez restreindre l'accès à un mécanisme de verrouillage.J'ai toujours des méthodes de générer des nombres aléatoires qui aideront à diverses fins. J'espère que cela peut vous aider aussi:
Vous pouvez aussi donner de la valeur minimale et maximale pour
Next()
fonction. Comme: