Disons que j'ai trois nombres pseudo aléatoires provenant de différents générateurs de nombres pseudo aléatoires. Puisque les générateurs ne refléteraient qu'une partie du processus de génération de nombres aléatoires réels, je crois qu'une manière de rapprocher un nombre du réel aléatoire pourrait être d'obtenir d'une manière ou d'une autre un "centre" des trois nombres pseudo aléatoires. Un moyen facile d'obtenir ce «centre» serait d'en prendre la moyenne, la médiane ou le mode (le cas échéant). Je me demande s'il existe un moyen plus sophistiqué en raison du fait qu'ils devraient représenter des nombres aléatoires.
3 Réponses :
Essayer d'utiliser une certaine forme de "centrage" s'avère être une mauvaise idée si votre objectif est d'avoir une meilleure représentation du caractère aléatoire.
Tout d'abord, une expérience de pensée. Si vous pensez que trois valeurs donnent plus de caractère aléatoire, ne serait-ce pas plus encore mieux? Il s'avère que si vous prenez la moyenne ou la médiane de n valeurs uniformes (0,1), comme n → ∞, elles convergent toutes deux vers 0,5, un point. Il se trouve également que le remplacement des distributions par une constante «représentative» est généralement une mauvaise idée si vous voulez comprendre les systèmes stochastiques. À titre d'exemple extrême, considérons les files d'attente. À mesure que le taux d'arrivée des clients / entités se rapproche du taux auquel ils peuvent être servis, les files d'attente stochastiques deviennent progressivement plus grandes en moyenne. Cependant, si les distributions d'arrivée et de service sont constantes, les files d'attente restent à une longueur nulle jusqu'à ce que le taux d'arrivée dépasse le taux de service, point auquel elles vont à l'infini. Lorsque les débits sont égaux, la file d'attente stochastique aurait des files d'attente infinies, tandis que la file d'attente déterministe resterait à sa longueur initiale (généralement supposée égale à zéro). L'infini et le zéro sont à peu près aussi différents que possible, ce qui montre que le remplacement des distributions dans un modèle de mise en file d'attente par leurs moyens ne vous donnerait aucune compréhension du fonctionnement réel des files d'attente.
Ensuite, des preuves empiriques. Ci-dessous les histogrammes des médianes et moyennes construites à partir de 10 000 échantillons de trois uniformes. Comme vous pouvez le voir, ils ont des formes de distribution différentes mais ne sont clairement plus uniformes. Les valeurs se regroupent au milieu et se raréfient progressivement vers les extrémités de l'intervalle (0,1).
La distribution uniforme a une entropie maximale pour les distributions continues sur un intervalle fermé , donc ces deux alternatives, étant non uniformes, ont une entropie nettement plus faible, c'est-à-dire plus prévisibles.
Merci beaucoup pour la méthode d'explication! Ce n'est donc pas du tout une bonne idée d'obtenir une valeur «représentative».
De rien. Vous pouvez toujours voter pour les réponses que vous trouvez utiles, ou même les marquer comme «la réponse» si vous pensez que c'est le cas.
Pour obtenir de bons nombres aléatoires, il est conseillé d'obtenir quelques bits d'entropie. Selon qu'ils sont utilisés à des fins de sécurité ou non, vous pouvez simplement obtenir l'heure de l'horloge système comme une graine pour un générateur de nombres aléatoires, ou utiliser des moyens plus sophistiqués. Le projet PWGen télécharger | SourceForge.net est open-source et surveille les événements Windows comme une source de bits d'entropie aléatoires.
Vous pouvez trouver plus d'informations sur la façon de faire des nombres aléatoires en C ++ à partir de ce SO? aussi: Génération de nombres aléatoires en C + +11: comment générer, comment ça marche? [fermé] . Il s'avère que les nombres aléatoires de C ++ ne sont pas toujours si aléatoires: Tout ce que vous n'avez jamais voulu pour connaître le random_device de C ++ ; donc chercher un bon moyen de semer, c'est-à-dire en passant le temps en mS à srand ()
et en appelant rand ()
pourrait être une solution rapide et sale. / p>
Eh bien, il existe une approche, appelée extracteur d'entropie, qui permet d'obtenir de (bons) nombres aléatoires à partir de sources pas tout à fait aléatoires.
Si vous avez trois RNG indépendants mais de faible qualité (biaisés), vous pourrait les combiner en une source uniforme.
Supposons que vous ayez trois générateurs vous donnant un seul octet chacun, alors la sortie uniforme serait
def RNG1(): return ... # single random byte def RNG2(): return ... # single random byte def RNG3(): return ... # single random byte from pyfinite import ffield def muRNG(): X = RNG1() Y = RNG2() Z = RNG3() GF = ffield.FField(8) return GF.Add(GF.Multiply(X, Y), Z)
où addition et les multiplications sont effectuées sur GF (2 8 ) fini champ .
Du code (Python)
t = X*Y + Z
Papier où cette idée a été exprimée
prendre la moyenne résulte en moins de randmness en fait, puisque le hasard est en un sens équivalent à une entropie élevée (aka hautes fréquences) alors que la moyenne (ou médiane ou similaire) entraîne un filtrage passe-bas qui exclut les hautes fréquences, donc moins d'entropie en moyenne
au lieu de cela, une technique facile à utiliser pour choisir au hasard un nombre dans la liste des nombres aléatoires.
Quel langage de programmation utilisez-vous?
Je peux utiliser presque n'importe quel langage de programmation pour cela. Alors n'hésitez pas à me faire part de votre suggestion quelle que soit la langue.