Question

Je fais des tests sur la classe au hasard et je l'ai utilisé le code suivant:

while (x++ <= 5000000)
{
    y = rnd.Next(1, 5000000);
    if (!data.Contains(y))
        data.Add(y);
    else
    {
        Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
        break;
    }
}

Je continuais de changer la limite rnd max (à savoir 5.000.000) et je l'ai changé le nombre d'itérations et je suis le résultat suivant:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

Pourquoi suis-je recevoir ces moyennes, à savoir de 10 fois j'ai vérifié pour chaque valeur, 80% du temps je reçois dans cette fourchette moyenne. Je ne pense pas que nous pouvons l'appeler près d'être aléatoire.

Que puis-je faire pour obtenir un nombre assez aléatoire.

Était-ce utile?

La solution

Vous n'êtes pas tester pour les cycles. Vous testez combien de temps il faut pour obtenir un nombre aléatoire que vous avez eu auparavant. C'est complètement différent . Vos chiffres sont sur place pour tester combien de temps il faut pour obtenir un nombre aléatoire que vous aviez avant. Regardez dans wikipedia sous « le paradoxe d'anniversaire » pour un tableau de la probabilité d'obtenir une collision après un certain nombre d'itérations.

Par pure coïncidence, la semaine dernière, j'ai écrit un article de blog sur ce sujet précis. Ça va aller vivre le 22 Mars; voir mon blog puis pour plus de détails.

Si ce que vous voulez tester est la durée du cycle d'un générateur de nombres pseudo-aléatoires, vous devez rechercher pas nombre vous avez eu avant, mais plutôt, longue séquence exacte de chiffres que vous avez eu avant. Il y a plusieurs façons intéressantes de le faire, mais il m'a probablement plus facile pour tout vous dire: la durée du cycle de Random est quelques milliards, de sorte que vous ne risquent pas d'être en mesure d'écrire un programme qui découvre ce fait. Il faudrait stocker un beaucoup de chiffres.

Cependant, la durée du cycle n'est pas la seule mesure de la qualité d'un générateur de nombres pseudo-aléatoires. Rappelez-vous, PRNGs sont pas aléatoire , ils sont prévisibles , et donc vous devez bien réfléchir à ce que votre métrique pour « aléatoire » est.

Donnez-nous plus de détails: pourquoi ça peut vous faire comment « aléatoire » Random est? Quelle application utilisez-vous pour que vous vous souciez? Quels aspects de hasard sont importants pour vous?

Autres conseils

Vous présumez que le caractère aléatoire est mieux si le nombre ne se répètent pas. Ce n'est pas vrai.

réel aléatoire n'a pas de mémoire. Lorsque vous choisissez le prochain numéro, la chance d'obtenir le même nombre est à nouveau tout aussi élevé que tout autre nombre dans la gamme.

Si vous lancez un dé et obtenir un six, puis rouler les dés, il n'y a pas moins de chance d'obtenir un nouveau six. Si vous arrive d'obtenir deux six dans une rangée, cela ne signifie pas que les dés est cassé.

Le caractère aléatoire de la classe au hasard, il bien sûr pas parfait, mais ce n'est pas ce que votre test révèle. Il montre simplement un penomenon que vous obtenez avec chaque générateur de nombres ranom, même si en réalité crée des nombres aléatoires et pas seulement des nombres pseudo-aléatoires.

Vous jugerez par paires aléatoire de répétition, ce qui est pas le meilleur test pour le hasard. Les répétitions que vous voyez sont semblables au paradoxe d'anniversaire: http://en.wikipedia.org/wiki/Birthday_problem , où un événement de répétition peut se produire avec une petite taille de l'échantillon si vous n'êtes pas à la recherche d'un événement spécifique.

Par la documentation http://msdn.microsoft.com /en-us/library/system.random.aspx

  

Pour générer un cryptographiquement sécurisé   nombre aléatoire approprié pour la création d'un   mot de passe aléatoire, par exemple, utiliser un   classe dérivée de    System.Security.Cryptography .. ::. RandomNumberGenerator   tel que    System.Security.Cryptography .. ::. RNGCryptoServiceProvider.

Un ordinateur ne peut pas générer un nombre aléatoire réel. si vous avez besoin d'un nombre réel aléatoire (David vous a donné la meilleure option dans le cadre dot net) vous avez besoin d'une source externe aléatoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top