Le hasard est à peine aléatoire à tous?
Je l'ai fait pour tester le caractère aléatoire de la randint:
>>> from random import randint
>>>
>>> uniques = []
>>> for i in range(4500): # You can see I was optimistic.
... x = randint(500, 5000)
... if x in uniques:
... raise Exception('We duped %d at iteration number %d' % (x, i))
... uniques.append(x)
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
Exception: We duped 887 at iteration number 7
J'ai essayé 10 fois plus et le meilleur résultat que j'ai obtenu était de 121 itérations avant d'un répéteur. Est-ce le meilleur genre de résultat que vous pouvez obtenir à partir de la bibliothèque standard?
- si vous voulez quelque chose de vraiment unique, pourquoi ne pas essayer uuid module? docs.python.org/library/uuid.html
- Parce que ce n'est pas vraiment unique. Juste très probablement.
- "The pragmatic programmer", la règle 26. "sélectionnez" N'est pas Rompu. Il est rare de trouver un bug dans le système d'exploitation ou le compilateur, ou même un produit tiers ou à la bibliothèque. Le bug est le plus probable dans l'application. Ou dans ce cas, l'application de la théorie des probabilités.
- dupe: stackoverflow.com/questions/2124748/...
- Juste en coupant les cheveux en quatre: uniques = set() et uniques.ajouter(x) serait plus approprié (efficace).
- Hankin ...quoi?
- Merci. J'adore ce genre de trucs. Je suis assez nouveau à la programmation que je ne suis absolument pas pris en compte coupant les cheveux en quatre.
- Dyno Fu Très agréable! J'ai essayé de 50 000 et il n'a jamais répété.
- L'une des principales propriétés de l'anniversaire paradoxe, c'est que c'est contre-intuitif. À moins que vous en soyez conscient ou des connaissances en théorie des probabilités, alors vous ne serait pas nécessairement de raison de faire une recherche par mot-clé pour cela. L'un de l'USP de Q&Un des sites est que vous pouvez poser une question en des termes que n'aurait jamais fait correspondre les réponses à la question si vous avez un pur mot clé de recherche, sans savoir quoi chercher.
- Je n'ai pas étudié la probabilité, mais je dirais que le hasard.randint(500, 5000) a beaucoup plus de chances de répétition que de tirer une carte deux fois de suite à partir d'un 4500 cartes après le brassage. Il vous faudra 346 fois en moyenne de tirer 2 cartes 13 fois de suite (le mélange à chaque fois) pour obtenir un seul répéteur. Il m'a fallu 8 essaie de l'obtenir pour arriver deux fois. Je n'ai pas à étudier la probabilité de voir l'évidence ici. (pas de manque de respect prévu. Je sais que la théorie des probabilités est très complexe, je ne peux pas aider mais la question de cette bibliothèque et algorithmes).
- votre réponse à ConcernedOfTunbridge): de quoi vous parlez est un tout autre problème. L'une est la probabilité d'obtenir la même carte deux fois dans une rangée; l'autre est la probabilité d'obtenir TOUT de la précédente N-1 cartes après la N des sélections. Le nombre moyen de cartes à partir d'un parfait RNG pour le deuxième problème devrait être d'environ 67; considérant que vous avez eu n'importe où à partir de 8 à 121, que les sons sur la droite.
- vous confondez Aléatoire Uniformément Distribué. Il est parfaitement valable pour un générateur aléatoire de revenir exactement la même valeur de plus de et la plus de nombreuses fois. Si vous voulez une Répartie Uniformément générateur de nombre Aléatoire qui est un tout autre problème, c'est un brassage problème qui n'est pas un générateur de problème.
- J'ai toujours considéré moi-même très en mathématiques intelligente et pragmatique sur l'analyse mathématique de problèmes connexes, mais la probabilité que je ne m'explique pas.
- sucette. Qui fait sens. Je n'ai pas vraiment regarder de cette façon.
- Ce qui rend ce une bonne question, c'est que vous être assez rare de trouver une réponse en cherchant sur le web, sauf si vous saviez précisément de la recherche pour "paradoxe d'anniversaire'.
Vous devez vous connecter pour publier un commentaire.
Le Paradoxe d'Anniversaire, ou pourquoi PRNGs produire des doublons plus souvent que vous ne le pensez.
Il ya un couple de questions à jouer dans le cas des OP problème. L'un est le le paradoxe d'anniversaire comme mentionné ci-dessus et la deuxième est la nature de ce que vous êtes la génération, qui ne sont pas intrinsèquement de garantir qu'un nombre donné ne sera pas répétée.
Le Paradoxe d'Anniversaire s'applique lorsque la valeur donnée peut se produire plus d'une fois au cours de la période du générateur et donc les doublons peuvent se produire au sein d'un échantillon de valeurs. L'effet de l'Anniversaire Paradoxe est que la probabilité réelle d'obtenir ces copies est tout à fait significatif et la durée moyenne de la période entre eux est plus petit que l'on pourrait autrement avoir pensé. Cette dissonance entre le perçu et le réel probabilités rend le Paradoxe d'Anniversaire un bon exemple d'un les biais cognitifs, où un naïf intuitive estimation est susceptible d'être sauvagement mal.
Une introduction rapide sur les Générateurs de nombres Pseudo Aléatoires (PRNGs)
La première partie de votre problème est que vous prenez de l'exposé de la valeur d'un générateur de nombre aléatoire et de le convertir en un nombre beaucoup plus restreint, de sorte que l'espace des valeurs possibles est réduit. Bien que certains pseudo générateurs de nombres aléatoires de ne pas répéter les valeurs au cours de leur période de cette transformation modifie le domaine à une beaucoup plus petite. Le plus petit domaine invalide le " pas de répétitions de l'état de sorte que vous pouvez s'attendre à une probabilité significative de répétitions.
Certains algorithmes, comme le à congruence linéaire PRNG (
A'=AX|M
) ne garantir l'unicité de l'ensemble de la période. Dans un LCG la valeur générée contient l'intégralité de l'état de l'accumulateur et sans aucun état n'est tenu. Le générateur est déterministe et ne peut pas répéter un certain nombre à l'intérieur de la période, tout accumulateur de valeur peut être uniquement une valeur successive. Par conséquent, chaque valeur ne peut se produire une fois à l'intérieur de la période du générateur. Toutefois, la période d'un tel GÉNÉRATEUR est relativement faible - environ 2^30 pour les implémentations de la LCG algorithme - et ne peut pas être plus grand que le nombre de valeurs distinctes.Pas tous PRNG algorithmes partagent cette caractéristique; certains peuvent répéter une valeur donnée dans la période. Dans le cas des OP problème, le Mersenne Twister de l'algorithme utilisé dans Python aléatoire module) a une très longue période - ce qui est beaucoup plus grand que 2^32. Contrairement à une Congruence Linéaire PRNG, le résultat n'est pas purement une fonction de la précédente, la valeur de sortie de l'accumulateur contient état supplémentaire. Avec entier de 32 bits de sortie et une période de ~2^19937, il ne peut pas fournir une telle garantie.
Le Mersenne Twister est un populaire algorithme pour PRNGs car il a de bonnes statistiques et propriétés géométriques et une très longue période - caractéristiques souhaitables pour un GÉNÉRATEUR utilisé sur les modèles de simulation.
Bonne propriétés statistiques dire que le nombre généré par l'algorithme sont uniformément distribués avec pas de numéros ayant une probabilité significativement plus élevée de paraître que d'autres. Pauvres propriétés statistiques pourrait produire indésirables biaiser les résultats.
Bonne géométriques properies dire que les ensembles de N chiffres ne mentent pas sur un hyperplane en N dimensions de l'espace. Pauvres propriétés géométriques peuvent générer de fausses corrélations dans un modèle de simulation et de fausser les résultats.
Une longue période signifie que vous pouvez générer beaucoup de chiffres avant la séquence s'enroule autour de la commencer. Si un modèle a besoin d'un grand nombre d'itérations ou doit être exécutée à partir de plusieurs graines puis le 2^30 nombres discrets disponibles à partir d'un type LCG mise en œuvre peut ne pas être suffisant. Le MT19337 algorithme a une très longue période - 2^19337-1, soit environ 10^5821. Par comparaison, le nombre total d'atomes dans l'univers est estimé à environ 10^80.
L'entier de 32 bits produit par un MT19337 PRNG ne représentent peut-être assez de valeurs discrètes pour éviter de répéter au cours de cette période importante. Dans ce cas, les valeurs en double sont susceptibles de se produire et inévitable avec un échantillon suffisamment grand.
Le Paradoxe d'Anniversaire en un mot
Ce problème est à l'origine défini comme la probabilité de deux personnes dans la chambre partage la même date d'anniversaire. Le point clé est que deux personnes dans la salle pourrait partager un anniversaire. Les gens ont tendance à la naïveté de mal interpréter le problème que la probabilité de quelqu'un dans la salle de partager un anniversaire à une personne en particulier, qui est la source de la les biais cognitifs qui provoque souvent des gens sous-estiment la probabilité. C'est l'hypothèse incorrecte - il n'y a aucune obligation pour le match pour être à une personne spécifique, et deux individus pourraient égaler.
La probabilité d'un match qui survient entre deux individus est beaucoup plus élevé que la probabilité d'une correspondance à une personne en particulier tant que le match n'a pas à être pour une date spécifique. Plutôt, vous n'avez qu'à trouver deux personnes qui partagent le même anniversaire. À partir de ce graphique (qui peut être trouvé sur la page de Wikipedia sur le sujet), nous pouvons voir que nous avons besoin seulement de 23 personnes dans la salle pour qu'il y ait 50% de chance d'en trouver deux qui correspondent de cette façon.
De la L'entrée de Wikipedia sur le sujet, nous pouvons obtenir une bon résumé. Dans le cas des OP de problème, nous avons de 4500 possible "anniversaires", plutôt que de 365. Pour un nombre donné de valeurs aléatoires générées (équivalant à "peuple"), nous cherchons à connaître la probabilité de tout deux valeurs identiques figurant au sein de la séquence.
Le calcul de l'effet probable de l'Anniversaire Paradoxe sur l'OP du problème
Pour une séquence de 100 numéros, nous avons
les paires (voir La compréhension du Problème) qui pourraient correspondre (c'est à dire le premier pourrait correspondre avec les deuxième, troisième, etc., la seconde pourrait correspondre à la troisième, quatrième, etc. et ainsi de suite), de sorte que le nombre de combinaisons qui pourraient potentiellement match est plutôt plus que juste 100.
De Le calcul de la Probabilité nous obtenons une expression de
. L'extrait suivant de code Python ci-dessous ne naïve de l'évaluation de la probabilité d'une paire produit.
Ce produit un bon résultat de la recherche p=0.669 pour un match survenu dans les 100 numéros échantillonnés à partir d'une population de 4500 valeurs possibles. (Peut-être que quelqu'un pourrait vérifier cela et de publier un commentaire si c'est faux). De cela, nous pouvons voir que les longueurs de pistes entre les nombres observés par les OP semblent être tout à fait raisonnable.
Note de bas de page: l'utilisation de brassage pour obtenir une unique séquence de nombres pseudo-aléatoires
Voir cette réponse ci-dessous à partir de S. Marc pour un moyen d'obtenir une garantie unique de nombres aléatoires. La technique de l'affiche fait référence à prend un tableau de nombres (qui vous offre, de sorte que vous pouvez les rendre uniques) et les mélange dans un ordre aléatoire. Dessin les numéros dans l'ordre de la mélangées tableau vous donnera une séquence de nombres pseudo-aléatoires qui sont garantis de ne pas répéter.
Note De Bas De Page: Cryptographique Sécurisé PRNGs
La MT algorithme n'est pas cryptographique sécurisé comme il est relativement facile d'en déduire l'état interne du générateur par l'observation d'une séquence de chiffres. D'autres algorithmes tels que Blum Blum Shub sont utilisés pour les applications cryptographiques, mais peut être impropre à la simulation ou général nombre aléatoire applications. Cryptographique sécurisé PRNGs peut être coûteux (peut-être besoin de bignum calculs) ou peut ne pas avoir de bonnes propriétés géométriques. Dans le cas de ce type d'algorithme, la première condition est qu'il doit être mathématiquement impossible d'en déduire l'état interne du générateur par l'observation d'une séquence de valeurs.
Avant de blâmer Python, vous devriez vraiment brosse quelques probabilités & la théorie de la statistique. Commencez par lire sur le le paradoxe d'anniversaire
Par le chemin, la
random
module en Python utilise le Mersenne twister PRNG, qui est considéré comme très bon, a une énorme période et a été largement testé. Alors soyez assurés que vous êtes dans de bonnes mains.Si vous ne voulez pas repetative un, de générer des séquentielle tableau et utiliser aléatoire.shuffle
random.shuffle
. C'est l'un des noyaux de mon projet 🙂Comme une réponse à la réponse de Nimbuz:
http://xkcd.com/221/
Aléatoire véritable inclut sans aucun doute la répétition de valeurs avant l'ensemble des valeurs possibles est épuisé. Il ne serait pas aléatoire, sinon, comme vous seriez en mesure de prédire combien de temps une valeur ne se reproduirait pas.
Si jamais vous dés lancés, vous avez sûrement eu 3 sixes en ligne assez souvent...
Python aléatoire de la mise en œuvre est en fait tout à fait l'état de l'art:
Ce n'est pas un répéteur. Un répéteur est quand vous répétez la même séquence. Pas juste un numéro.
De la production de
4500
nombres aléatoires à partir d'une gamme500 <= x <= 5000
. Vous vérifiez pour chaque numéro, si elle a été généré avant. Le problème d'anniversaire nous dit que la probabilité est pour deux de ces numéros à la hauteur de donnéen
tente une gammed
.Vous pouvez également inverser la formule pour calculer le nombre de numéros que vous avez à générer jusqu'à ce que la probabilité d'obtenir un double est plus que
50%
. Dans ce cas, vous avez un>50%
de chance de trouver un numéro en double après79
itérations.Vous avez défini un aléatoire de l'espace de 4501 valeurs (de 500 à 5 000), et vous êtes itération 4500 fois. Vous êtes assurés de bénéficier d'une collision dans le test que vous avez écrit.
À penser d'une autre manière:
Donc, le temps que vous obtenez à 45/4500, que insertion a un 1% de chance d'avoir un doublon, et que la probabilité ne cesse d'augmenter à chaque insertion.
Pour créer un test qui teste vraiment les capacités de la fonction aléatoire, augmentation de l'univers de possibles valeurs aléatoires (par exemple: 500-500000), Vous pouvez ou ne pouvez pas obtenir une dupe. Mais vous aurez beaucoup plus d'itérations en moyenne.
Pour quelqu'un d'autre à ce problème, j'ai utilisé l'uuid.uuid4() et il fonctionne comme un charme.
Il y a le paradoxe d'anniversaire. Compte tenu de cela, vous vous rendez compte que ce que vous dites, c'est que trouver "764, 3875, 4290, 4378, 764" ou quelque chose comme ça n'est pas très aléatoire, car un certain nombre dans cette séquence se répète. La vraie façon de le faire est de comparer les séquences les unes aux autres. J'ai écrit un script python pour ce faire.