Wie wählen Sie eine zufällige Zeile aus einer Textdatei
Ich versuche, eine Lotterie-Programm für meine Schule (wir haben ein ökonomisches system).
Mein Programm generiert zahlen und speichert Sie in eine text-Datei. Wenn ich will, zu "ziehen" zahlen Sie aus meinem generator ich will es, um sicherzustellen, dass es einen Sieger gibt.
Q: Wie kann ich Python-wählen Sie eine zufällige Zeile aus meinem text-Datei, und geben Sie die Ausgabe so, dass die Nummer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, die Datei ist relativ klein, das folgende ist vielleicht der einfachste Weg, es zu tun:
Wenn die Datei ist sehr groß - Sie könnte versuchen, eine zufällige Position in der Datei gegeben, die Größe der Datei und dann die nächste Zeile:
Obwohl die meisten Ansätze gegeben, die hier arbeiten, aber Sie neigen dazu, laden Sie die gesamte Datei im Speicher auf einmal. Aber nicht bei diesem Ansatz. Also selbst wenn die Dateien groß sind, das funktionieren würde.
Den Ansatz nicht sehr intuitiv auf den ersten Blick. Die these dahinter besagt, dass, wenn wir gesehen haben, N Linien dort sind eine Wahrscheinlichkeit von exakt 1/N, dass jede von Ihnen ausgewählt ist, so weit.
Ab Seite 123 von 'Python-Kochbuch'
Mit einer leichten Modifikation, um Ihre input-Datei (speichert die Anzahl der Elemente in der ersten Zeile), du kannst eine Zahl gleichmäßig, ohne zu Lesen die gesamte Datei in den Speicher erste.
Sagen, Sie haben 100 zahlen. Die Wahrscheinlichkeit der Wahl die erste Zahl gibt 1/100. Die Wahrscheinlichkeit für die Wahl der zweiten Zahl ist (99/100)(1/99) = 1/100. Die Wahrscheinlichkeit der Wahl, die Dritte Zahl ist (99/100)(98/99)(1/98) = 1/100. Ich werde zum überspringen der formalen Beweis, aber die Verschiedenheit der Wahl keine der 100 Nummern ist 1/100.
Ist es nicht unbedingt notwendig ist, um zu speichern die Anzahl in der ersten Zeile, aber es spart Ihnen die Mühe, um die gesamte Datei zu Lesen nur zum zählen der Zeilen. So oder so, müssen Sie nicht speichern Sie die gesamte Datei in den Speicher zu wählen, jede einzelne Zeile mit gleicher Wahrscheinlichkeit auf.
random.randrange
für jede Zeile. nur nach dem Zufallsprinzip wählen Sie die Nummer der Zeile, und bewegen uns auf dieser Linie.Aus der Spitze von meinem Kopf:
anderen Ansatz:
Verteilung:
Ich nicht sehen, die skewnes aber vielleicht ist die Datenmenge ist zu klein...
randrange(0,1)
wird immer 0 zurück), es wird nie zurückgegeben werden, es sei denn, kein andere Nummer gewählt. Beachten Sie, Ihre-Verteilung sieht aus wie eine umgekehrte Glockenkurve, die die extremen zahlen, die deutlich häufiger durch die Mitte zahlen.enumerate()
könnte anstelle von verwendet werdenfileinput.lineno()
Sah ich ein python-tutorials und fand dieses snippet: