Comment générer un entier aléatoire en C #?
1922
La Random
classe est utilisée pour créer des nombres aléatoires. (Pseudo-aléatoire, bien sûr.).
Exemple:
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
Si vous souhaitez créer plusieurs nombres aléatoires, vous devez conserver l' Random
instance et la réutiliser. Si vous créez de nouvelles instances trop proches dans le temps, elles produiront la même série de nombres aléatoires que le générateur aléatoire est issu de l'horloge système.
rnd
commestatic
et / ou le définir une seule fois lors de l'initialisation du code.Random
...Random
faire pour rendre votre aléatoire plus robuste: ericlippert.com/2019/02/04/fixing-random-part-2 et codeblog.jonskeet.uk/2009/11/04/revisiting -la aléatoire .La question semble très simple mais la réponse est un peu compliquée. Si vous voyez, presque tout le monde a suggéré d'utiliser la classe Random et certains ont suggéré d'utiliser la classe de chiffrement RNG. Mais alors quand choisir quoi.
Pour cela, nous devons d'abord comprendre le terme RANDOMNESS et la philosophie qui le sous-tend.
Je vous encourage à regarder cette vidéo qui approfondit la philosophie de RANDOMNESS en utilisant C # https://www.youtube.com/watch?v=tCYxc-2-3fY
Tout d'abord, comprenons la philosophie de RANDOMNESS. Lorsque nous disons à une personne de choisir entre ROUGE, VERT et JAUNE ce qui se passe en interne. Qu'est-ce qui fait qu'une personne choisit ROUGE ou JAUNE ou VERT?
Une pensée initiale va dans l'esprit de la personne qui décide de son choix, il peut s'agir de la couleur préférée, de la couleur chanceuse, etc. En d'autres termes, un déclencheur initial que nous appelons RANDOM comme SEED. Ce SEED est le point de départ, le déclencheur qui l'incite à sélectionner la valeur RANDOM.
Maintenant, si un SEED est facile à deviner, ce type de nombres aléatoires est appelé PSEUDO et lorsqu'une graine est difficile à deviner, ces nombres aléatoires sont appelés nombres aléatoires SECURED .
Par exemple, une personne choisit sa couleur en fonction de la météo et de la combinaison sonore, alors il serait difficile de deviner la graine initiale.
Permettez-moi maintenant de faire une déclaration importante: -
* La classe "Random" génère uniquement un nombre aléatoire PSEUDO et pour générer un nombre aléatoire SECURE, nous devons utiliser la classe "RNGCryptoServiceProvider".
La classe aléatoire prend des valeurs de départ de votre horloge CPU, ce qui est très prévisible. Donc, en d'autres termes, la classe RANDOM de C # génère des nombres pseudo-aléatoires, voici le code pour le même.
** Remarque: **
.NET Core 2.0.0+
utilise une graine différente sur le constructeur sans paramètre: au lieu de l'horloge CPU qu'il utiliseGuid.NewGuid().GetHashCode()
.Alors que la
RNGCryptoServiceProvider
classe utilise l'entropie du système d'exploitation pour générer des graines. L'entropie du système d'exploitation est une valeur aléatoire qui est générée à l'aide du son, des clics de souris et des synchronisations du clavier, de la température thermique, etc. Ci-dessous, le code correspondant.Pour comprendre l'entropie du système d'exploitation, consultez cette vidéo de 14h30 https://www.youtube.com/watch?v=tCYxc-2-3fY où la logique de l'entropie du système d'exploitation est expliquée. Donc, en termes simples, RNG Crypto génère des nombres aléatoires SÉCURISÉS.
la source
RandomNumberGenerator.Create()
au lieu d'appeler le constructeur deRNGCryptoServiceProvider
car il n'est pas disponible sur toutes les plateformes.Chaque fois que vous faites un nouveau Random (), il est initialisé. Cela signifie que dans une boucle serrée, vous obtenez souvent la même valeur. Vous devez conserver une seule instance aléatoire et continuer à utiliser Next sur la même instance.
la source
Random
objet. Dans les deux cas, j'ai obtenu le même nombre aléatoire. Avec l'approche de Pankaj, cela ne s'est pas produit. C'est peut-être aléatoire , mais j'en doute maintenant. Je demande le nombre aléatoire dans la même seconde à partir de différents threads.Méfiez-vous qui
new Random()
est semé sur l'horodatage actuel.Si vous souhaitez générer un seul numéro, vous pouvez utiliser:
new Random().Next( int.MinValue, int.MaxValue )
Pour plus d'informations, consultez la classe Random , mais veuillez noter:
N'utilisez donc pas ce code pour générer une série de nombres aléatoires.
la source
new Random()
en boucle est un point important.la source
Je voulais ajouter une version cryptographiquement sécurisée:
Classe RNGCryptoServiceProvider ( MSDN ou dotnetperls )
Il implémente IDisposable.
la source
Vous pouvez utiliser la méthode StaticRandom de Jon Skeet dans la bibliothèque de classes MiscUtil qu'il a construite pour un nombre pseudo-aléatoire.
la source
J'ai essayé toutes ces solutions à l'exception de la réponse COBOL ... lol
Aucune de ces solutions n'était assez bonne. J'avais besoin de randoms dans une boucle rapide pour int et j'obtenais des tonnes de valeurs en double même dans des plages très larges. Après avoir choisi des résultats aléatoires beaucoup trop longtemps, j'ai décidé de m'attaquer définitivement à ce problème une fois pour toutes.
Tout tourne autour de la graine.
Je crée un entier aléatoire en analysant les non-chiffres de Guid, puis je l'utilise pour instancier ma classe Random.
Mise à jour : l'amorçage n'est pas nécessaire si vous instanciez une fois la classe Random. Il serait donc préférable de créer une classe statique et d'appeler une méthode hors de cela.
Ensuite, vous pouvez utiliser la classe statique comme ça ..
J'avoue que j'aime mieux cette approche.
la source
Les nombres générés par la
Random
classe intégrée (System.Random) génèrent des nombres pseudo aléatoires.Si vous voulez de vrais nombres aléatoires, le plus proche que nous pouvons obtenir est un "générateur pseudo aléatoire sécurisé" qui peut être généré en utilisant les classes cryptographiques en C # telles que
RNGCryptoServiceProvider
.Même ainsi, si vous avez toujours besoin de vrais nombres aléatoires, vous devrez utiliser une source externe telle que des appareils représentant la désintégration radioactive comme source pour un générateur de nombres aléatoires. Puisque, par définition, tout nombre généré par des moyens purement algorithmiques ne peut pas être vraiment aléatoire.
la source
créer un objet aléatoire
et l'utiliser
vous n'avez pas besoin d'initialiser
new Random()
chaque fois que vous avez besoin d'un nombre aléatoire, d'initier un aléatoire puis de l'utiliser autant de fois que nécessaire dans une boucle ou autrela source
new Random()
utilise les ticks actuels comme graine. Lorsque vous instanciez plusieurs instances dans la même milliseconde (au lieu de cocher), vous obtiendrez la même valeur retournée.Réponse modifiée d' ici .
Si vous avez accès à un processeur compatible Intel Secure Key, vous pouvez générer de vrais nombres et chaînes aléatoires à l'aide de ces bibliothèques: https://github.com/JebteK/RdRand et https://www.rdrand.com/
Téléchargez simplement la dernière version à partir d' ici , incluez Jebtek.RdRand et ajoutez une instruction using pour cela. Ensuite, tout ce que vous devez faire est le suivant:
Si vous n'avez pas de CPU compatible pour exécuter le code, utilisez simplement les services RESTful sur rdrand.com. Avec la bibliothèque d'encapsulation RdRandom incluse dans votre projet, il vous suffira de le faire (vous recevez 1000 appels gratuits lorsque vous vous inscrivez):
la source
J'ai utilisé le code ci-dessous pour avoir un nombre aléatoire (non recommandé):
la source
Bien que ce soit correct:
Vous voudriez contrôler la limite (nombre minimum et maximum) la plupart du temps. Vous devez donc spécifier où commence et se termine le nombre aléatoire.
La
Next()
méthode accepte deux paramètres, min et max.Donc, si je veux que mon nombre aléatoire soit entre disons 5 et 15, je ferais juste
la source
Ceci est la classe que j'utilise. Fonctionne comme
RandomNumber.GenerateRandom(1, 666)
la source
Je voulais montrer ce qui se passe lorsqu'un nouveau générateur aléatoire est utilisé à chaque fois. Supposons que vous ayez deux méthodes ou deux classes nécessitant chacune un nombre aléatoire. Et vous les codez naïvement comme:
Pensez-vous que vous obtiendrez deux identifiants différents? NAN
La solution est de toujours utiliser un seul générateur aléatoire statique. Comme ça:
la source
RNGCryptoServiceProvider
c'est un meilleur appel de toute façon.Pour une graine aléatoire forte, j'utilise toujours CryptoRNG et non Time.
la source
la source
Juste comme une note pour référence future.
Si vous utilisez .NET Core, plusieurs instances aléatoires ne sont pas aussi dangereuses qu'auparavant. Je sais que cette question date de 2010, mais comme cette question est ancienne mais présente un certain attrait, je pense que c'est une bonne chose de documenter le changement.
Vous pouvez vous référer à cette question que j'ai posée il y a quelque temps:
Microsoft a-t-il modifié la valeur par défaut Aléatoire?
Fondamentalement, ils ont changé la valeur par défaut de
Environment.TickCount
enGuid.NewGuid().GetHashCode()
, donc si vous créez 2 instances de Random, elle n'affichera pas les mêmes nombres.Vous pouvez voir les différences de fichier de .NET Framework / .NET Core (2.0.0+) ici: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d
Ce n'est pas aussi sûr que RNGCryptoServiceProvider, mais au moins cela ne vous donnera pas de résultats étranges.
la source
Interop.GetRandomBytes((byte*)&result, sizeof(int));
.Les nombres calculés par un ordinateur selon un processus déterministe, ne peuvent, par définition, être aléatoires.
Si vous voulez un véritable nombre aléatoire, le caractère aléatoire provient du bruit atmosphérique ou de la désintégration radioactive.
Vous pouvez essayer par exemple RANDOM.ORG (cela réduit les performances)
la source
Mettez toutes les valeurs que vous voulez dans les deuxièmes parenthèses assurez-vous d'avoir défini un nom en écrivant prop et double tab pour générer le code
la source
Si vous voulez qu'un CSRNG génère des nombres aléatoires entre un min et un max, c'est pour vous. Il initialisera les
Random
classes avec des graines aléatoires sécurisées.la source
Désolé, OP nécessite en effet une
int
valeur aléatoire , mais dans le simple but de partager des connaissances si vous voulez uneBigInteger
valeur aléatoire , vous pouvez utiliser la déclaration suivante:la source
Je suppose que vous voulez un générateur de nombres aléatoires uniformément distribué comme ci-dessous. Le nombre aléatoire dans la plupart des langages de programmation, y compris C # et C ++, n'est pas mélangé correctement avant de les utiliser. Cela signifie que vous obtiendrez le même nombre encore et encore, ce qui n'est pas vraiment aléatoire. Pour éviter de tirer le même nombre encore et encore, vous avez besoin d'une graine. En règle générale, les ticks dans le temps conviennent à cette tâche. N'oubliez pas que vous obtiendrez le même nombre encore et encore si vous utilisez la même graine à chaque fois. Essayez donc d'utiliser toujours des semences variées. Le temps est une bonne source de semences car elles changent toujours.
si vous recherchez un générateur de nombres aléatoires pour une distribution normale, vous pouvez utiliser une transformation Box-Muller. Vérifiez la réponse de yoyoyoyosef dans Question variable gaussienne aléatoire. Puisque vous voulez un entier, vous devez convertir une valeur double en entier à la fin.
Variables gaussiennes aléatoires
la source
Le moyen le plus simple est probablement juste
Random.range(1, 3)
Cela générerait un nombre compris entre 1 et 2.la source
Vous pouvez essayer avec une valeur de départ aléatoire en utilisant ci-dessous:
la source
Pourquoi ne pas utiliser
int randomNumber = Random.Range(start_range, end_range)
?la source
Utiliser une instance de Random à plusieurs reprises
Cet article examine les raisons pour lesquelles le caractère aléatoire cause tant de problèmes et comment les résoudre. http://csharpindepth.com/Articles/Chapter12/Random.aspx
la source
Random
n'est pas une classe thread-safe. Si vous créez une seule instance, vous devez restreindre l'accès à celle-ci derrière un mécanisme de verrouillage.Essayez ces étapes simples pour créer des nombres aléatoires:
Créer une fonction:
Utilisez la fonction ci-dessus à un endroit où vous souhaitez utiliser des nombres aléatoires. Supposons que vous souhaitiez l'utiliser dans une zone de texte.
0 est min et 999 est max. Vous pouvez modifier les valeurs comme vous le souhaitez.
la source
J'ai toujours des méthodes qui génèrent des nombres aléatoires qui aident à diverses fins. J'espère que cela peut aussi vous aider:
la source
Rapide et facile pour en ligne, utilisez le code ci-dessous:
la source