Numéros aléatoires en utilisant C #
Je cherche à générer un nombre aléatoire entre 1 et 5 millions de dollars. Le processus n'a pas à être rapide (bien que ce serait bien si elle l'était), mais il doit être aussi aléatoire que possible (je sais que rien n'est aléatoire). J'ai une variété de sources de données pour la postérité.
Je ne suis pas sûr si le .NET Aléatoire classe va être assez bon pour cela.
Ce sera utilisée pour sélectionner un billet gagnant.
source d'informationauteur LiamB
Vous devez vous connecter pour publier un commentaire.
La
System.Random
classe est probablement assez bon:La seule chose que vous avez à regarder dehors pour est que vous n'avez pas réutiliser la même graine trop souvent:
Si vous avez besoin de chiffrement de nombre aléatoire, aller avec le
System.Security.Cryptography.RNGCryptoServiceProvider
de la classe ou de l'utilisation de laRandomNumberGenerator.Create()
usine méthode pour créer de la valeur par défaut configurée générateur de nombre aléatoire.Il y avait effectivement un très bon article que j'ai lu assez récemment sur les différents types de PRNGs et comment ils se comportent dans des conditions différentes à l'aléatoire des tests. Malheureusement, je n'arrive pas à le trouver maintenant. L'essentiel, cependant, est que la valeur par défaut des générateurs de nombres aléatoires dans presque tous les populaire langage de programmation sont assez naïfs et ont assez des préjugés.
Une autre réponse déjà mentionne qu'aucune PRNG à tous, peu importe le degré de sophistication de l'algorithme, est assez bonne pour les applications cryptographiques. Ce qui est vrai. Puisque vous mentionnez que ce sera utilisé pour "sélectionner un billet gagnant", ignorons pour l'instant.
L'algorithme de Knuth utilisés par les .NET
System.Random
classe est principalement optimisé pour la vitesse, pas de distribution aléatoire. Il est "suffisamment aléatoire" pour de nombreuses fins, dont la plupart des applications ne jamais trop s'éloigner, mais dans les domaines de (un) de jeu et (b) de la statistique de la simulation, la plupart des gens semblent penser que c'est un mauvais choix. C'est mieux que le LCGs celui utilisé par défaut dans les anciennes bibliothèques, mais vous ne voulez pas l'utiliser pour quelque chose comme un loto.Ne pas se laisser berner en pensant que vous venez d'utiliser un crypto source, soit. Le problème avec crypto le Rng est qu'ils remplissent un flux d'octets, mais le transformer en un seul nombre entier aléatoire entre x et y exige que vous de faire de l'arithmétique modulaire (ou de l'arrondissement - même résultat de toute façon). Et si votre gamme hasard ne divise pas parfaitement uniformément dans toutes les puissance de 2 est défini par l'octet de longueur, alors vous allez finir avec un biais dans les numéros les plus bas. Les données générées ont un haut niveau d'entropie, mais votre résultat sera biaisée.
Comme un simple exemple, disons que vous obtenez un "parfait" nombre aléatoire de 1 à 10 et maintenant, vous voulez transformer en un nombre aléatoire entre 1 et 7. Comment voulez-vous faire? Simplement le calcul de
result % 7
sera fortement biaisée vers les numéros 1-3. Il y a quelques façons de réduire le biais lors de l'utilisation d'un crypto RNG, mais le point que j'essaie de faire, c'est que le crypto-Rng sont conçus pour le cryptage des applications, et à l'aide de l'un de ceux pour une simulation de Monte Carlo n'est généralement pas la meilleure idée.Autant que je sache, le plus populaire des "bonnes" PRNG aujourd'hui, qui est utilisé couramment dans des applications de jeux, est le Mersenne Twister. Il y a un .NET mise en œuvre ici. Cet algorithme passe tous les Inconditionnels De Tests pour la distribution aléatoire; il montre presque pas de parti pris et c'est un bon choix lorsque vous êtes en utilisant des nombres aléatoires pour probabiliste et statistique des applications.
La Bibliothèque Scientifique GNU a également un certain nombre de RNG algorithmes et, sans surprise, le nombre de Mersenne Twister est en haut de la liste. Certains autres sont à la peine de regarder par curiosité en soi, cependant; RANLUX aussi des scores assez haut sur la inconditionnels de test IIRC.
Eric est correct avec son commentaire, bien sûr; l'ensemble de ces informations est pour rien si vous n'avez pas d'exigences techniques spécifiques sur le thème "comment aléatoire" vous avez besoin de vos nombres aléatoires. Je suis en utilisant une définition qui serait applicable à un nombre relativement faible incidence de jeu/application de jeu (c'est à dire pas grand enregistrés site de jeux en ligne avec des millions de visiteurs par jour, - il y a des règles plus strictes sur le caractère aléatoire de ceux-ci).
Voir Jon Skeet blog de Revisiter L'Aléatoire une très bonne façon d'utiliser l'Aléatoire:
Pour générer un nombre aléatoire, créez un objet de
Random
classe, et ensuite utiliserNext
la fonction de cet objet pour générer un nombre aléatoire. Il a de nombreuses surcharges comme:où vous pouvez spécifier la plage minimale et maximale entre lesquelles vous souhaitez que le nombre aléatoire.
Extrait de Code:
Le Système.Hasard de classe est très problématique et n'est pas un bon ajustement avec l'exigence. En théorie, il devrait fournir de meilleurs résultats que beaucoup d'autres pseudo-générateurs aléatoires. C'est une directe et littérale port de l'exemple de code C pour un été à la Traîne de Fibonacci Générateur (LFG) à la page 283 de la deuxième édition de "Numerical Recipes in C" (le code a été ré-écrite dans les éditions ultérieures). LFGs utiliser un meilleur algorithme que Linéaire Générateurs à Congruence (LCGs) utilisé est beaucoup d'autres bibliothèques (par exemple, Java).
Malheureusement, l'implémentation Microsoft du Système.Hasard de classe a un bug. Voir http://connect.microsoft.com/VisualStudio/feedback/details/634761/system-random-serious-bug pour plus d'informations. Il semble que quelqu'un accidentellement tapé dans '21" lorsque l'destiné à taper '31'. Cela compromet l'algorithme en pseudo-aléatoire de caractéristiques. Le lien inclut une explication de la part de MS pour lesquelles ils ne se sentent pas capables de corriger l'erreur à ce stade.
Si vous êtes à la recherche pour de vrais nombres aléatoires, alors vous devriez envisager d'utiliser une ligne de générateur de nombre aléatoire qui utilise phénomène naturel, comme http://www.random.orgqui utilise le bruit atmosphérique. De vrais nombres aléatoires aussi faire de bonnes graines pour les pseudo-générateurs de nombres aléatoires.
Sipwiz montre comment l'utiliser en C# dans sa réponse: Générer des valeurs aléatoires en C#. Il est également discuté ici: http://www.vcskicks.com/random-number-generator.php.
Il y a beaucoup d'angles de générateurs de nombres aléatoires. Une alternative intéressante mise en œuvre est d'ISSAC (ttp://burtleburtle.net/bob/rand/isaac.html), qui contient également une bonne discussion de biais et un tel, et il y a une version C#, trop (http://burtleburtle.net/bob/rand/isaacafa.html).
.NET Aléatoire devrait être bon pour ce: