С небольшими изменениями в входном файле (хранить количество элементов в первой строке), вы можете выберите номер равномерно, не прочитав сначала весь файл в памяти.
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
Скажем, у вас есть 100 номеров. Вероятность выбора первого номера - 1/100. Вероятность выбора второго номера равна (99/100) (1/99) = 1/100. Вероятность выбора третьего номера равна (99/100) (98/99) (1/98) = 1/100. Я пропущу формальное доказательство, но вероятность выбора любого из 100 номеров - 1/100.
Нет необходимости хранить счет в первой строке, но это избавляет вас от необходимости читать весь файл только для подсчета строк. В любом случае вам не нужно хранить весь файл в памяти, чтобы выбрать любую одну строку с равной вероятностью.
по какой-то причине, когда я пытаюсь свой метод, который я получаю следующее сообщение _italic_ ** жирный ** 'Traceback (самый последний вызов последним): Файл«/ Users/pilotkid/Документы/лотерею. py ", строка 338, в line = random.choice (open ('KEEP-IMPORANT.txt'). readlines()) Файл« /System/Library/Frameworks/Python.framework/Versions/2.7/lib/ python2.7/random.py ", строка 274, по выбору return seq [int (self.random() * len (seq))] # вызывает индексError, если seq пуст IndexError: индекс индекса за пределами допустимого диапазона выход из системы [Процесс завершен] ' –
Неверный файл? – NPE
получается, что он не делал файл. Нечетное спасибо за все ваше время –