z niewielkimi zmianami do pliku wejściowego (zapisać numer pozycji w pierwszej linii), można wybierz numer równomiernie bez konieczności wcześniejszego odczytu całego pliku do pamięci.
import random
def choose_number(frame):
with open(fname, "r") as f:
count = int(f.readline().strip())
for line in f:
if not random.randrange(0, count):
return int(line.strip())
count-=1
Powiedz, że masz 100 numerów. Prawdopodobieństwo wyboru pierwszej liczby to 1/100. Prawdopodobieństwo wyboru drugiej liczby to (99/100) (1/99) = 1/100. Prawdopodobieństwo wybrania trzeciego numeru to (99/100) (98/99) (1/98) = 1/100. Pomijam formalny dowód, ale szanse na wybranie dowolnej ze 100 liczb to 1/100.
Nie jest absolutnie konieczne przechowywanie licznika w pierwszym wierszu, ale oszczędza to kłopotu z koniecznością przeczytania całego pliku tylko po to, aby policzyć wiersze. Tak czy inaczej, nie musisz przechowywać całego pliku w pamięci, aby wybrać jedną linię z takim samym prawdopodobieństwem.
z jakiegoś powodu, gdy próbuję metodę otrzymuję następujący komunikat _italic_ ** pogrubiony ** 'Traceback (najnowsza rozmowę ostatnia): Plik„/ Users/pilotkid/Dokumenty/loterii. py ", linia 338, w line = random.choice (open ('KEEP-IMPORANT.txt'). readlines()) Plik" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/ python2.7/random.py ", wiersz 274, w wyborze return seq [int (self.random() * len (seq))] # podnosi IndexError jeśli seq jest pusty IndexError: indeks listy poza zakresem wylogowanie [Proces zakończony] ' –
Czy plik jest pusty? – NPE
okazuje się, że nie tworzył pliku. Dziwne dzięki za cały twój czas –