Comment choisir une ligne aléatoire à partir d'un fichier texte
Je suis en train de faire un programme de la loterie pour mon école (nous avons un système économique).
Mon programme génère des nombres et l'enregistre dans un fichier texte. Quand j'ai envie de "tirer" les chiffres de mon générateur, je veux qu'elle pour s'assurer qu'il y est un gagnant.
Q: Comment puis-je avoir Python sélectionner aléatoirement une ligne de mon fichier texte et donner à ma sortie que ce nombre?
OriginalL'auteur Suit Boy Apps | 2013-02-17
Vous devez vous connecter pour publier un commentaire.
En supposant que le fichier est relativement faible, ce qui suit est peut-être la façon la plus simple de le faire:
OriginalL'auteur NPE
Si le fichier est très volumineux, pourraient chercher à un endroit aléatoire dans le fichier donné la taille du fichier et ensuite obtenir la prochaine pleine ligne:
il serait également ne jamais revenir à la première ligne, et ne renvoie pas une ligne à tous quand random_point est dans la dernière ligne.
OriginalL'auteur Ali-Akber Saifee
Bien que la plupart des approches donné ici, mais ils ont tendance à charger tout le fichier dans la mémoire à la fois. Mais pas cette approche. Donc, même si les fichiers sont gros, ce serait le travail.
L'approche n'est pas très intuitif au premier coup d'œil. Le théorème derrière cette stipule que, lorsque nous avons vu N lignes il y a une probabilité de 1/N que chacun d'eux est choisi jusqu'à présent.
À partir de la Page n ° 123 de la " Python Cookbook'
OriginalL'auteur iankit
Avec une légère modification à votre fichier d'entrée (store le nombre d'éléments dans la première ligne), vous pouvez choisir un certain nombre uniformément sans avoir à lire tout le fichier en mémoire.
Disons que vous disposez de 100 numéros. La probabilité de choisir le premier nombre est de 1/100. La probabilité de choisir le second nombre correspond à (99/100)(1/99) = 1/100. La probabilité de choisir le troisième numéro est (99/100)(98/99)(1/98) = 1/100. Je vais passer la preuve formelle, mais les chances de choisir un des 100 numéros est de 1/100.
Il n'est pas strictement nécessaire pour stocker le nombre dans la première ligne, mais il vous évite d'avoir à lire le fichier en entier juste pour compter les lignes. De toute façon, vous n'avez pas besoin de stocker l'intégralité du fichier en mémoire de choisir une seule ligne avec une probabilité égale.
random.randrange
pour chaque ligne. juste choisir au hasard le numéro de la ligne et aller de l'avant de cette ligne.OriginalL'auteur chepner
Sur le dessus de ma tête:
OriginalL'auteur Srdjan Grubor
une autre approche:
Distribution:
Je ne vois pas le skewnes mais peut-être le jeu de données est trop petit...
voir mise à jour. Ne voyez pas le skewnes...
C'est biaisé un peu différemment que ce que j'attendais (je n'ai pas regardé ton code avec soin). Vous êtes essentiellement de la sélection d'un ensemble de nombres de 1 à 10, puis outputing la plus grande. Ainsi, bien qu'il n'y a plus de chance de 1 étant choisi dans le cadre de la série (en fait, il va toujours faire partie de l'ensemble, depuis
randrange(0,1)
retourne toujours 0), il ne sera jamais retourné à moins que aucun d'autres le numéro choisi. L'avis de votre distribution ressemble à une inversion de la courbe en cloche, avec l'extrême numéros choisis de manière signicative le plus souvent le nombre du milieu.Donc, j'ai travaillé sur quelques probabilités, et le biais en faveur de sélection de plus petits nombres et le biais en faveur de sortie de plus grands annuler parfaitement, de sorte que vous devriez obtenir un 1/10 occasion de la sortie d'un des 10 numéros. Par exemple, les chances de sélection, le nombre 3 est de 1/3, mais les chances de pas sélection d'un plus grand nombre sont (3/4)(4/5)...(9/10), et le produit des deux fonctionne exactement à 1/10. Je pense que l'inversion de la courbe en forme de cloche que j'ai vu est probablement en raison de la petite taille de l'échantillon.
+1. il n'y a pas d'asymétrie. L'algorithme produit une distribution uniforme. @chepner: il est bien connu réservoir d'échantillonnage avec k==1 l'algorithme.
enumerate()
pourrait être utilisé à la place defileinput.lineno()
OriginalL'auteur Fredrik Pihl
J'ai vu un python tutoriels et trouvé cet extrait:
OriginalL'auteur Suit Boy Apps