Функция, которая извлекает случайные числа и постепенно исключает те, которые генерируют - PullRequest
2 голосов
/ 06 ноября 2019

Я пытаюсь сделать лотерейный экстрактор, и мне нужен скрипт, который извлекает случайные числа и сохраняет извлеченные, чтобы не извлекать их снова.

Я пришел с идеей сохранить извлеченные числа втекстовый файл (ToExclude.txt) и использование файла в качестве «извлеченной» переменной.

Я попытался сделать это безуспешно:

import random

f = open("ToExclude.txt", "r") #Opens the txt in read mode
NumToExclude = f.read() #Stores the txt file (with the previous extracted numbers)
f.close()
open("ToExclude.txt", "w").close() #Erases the content of the file

number = random.randint(1,100) #Random number generator

if number in NumToExclude: #Verifies that the number is not in the Extracted list
    [RESTART FUNCTION] #Restarts the function to generate another number
else:
    NumToExclude.append(number) #If is not in the list add the number to the lsit

print("The number is: {}".format(number)) #Example of output

f = open("ToExclude.txt", "w")  #Stores the extracted number in the txt file
f.write(str(NumToExclude))
f.close()

Когда я выполняю его первымидет хорошо, но после 2-го текстовый файл выглядит так:

['[', '5', '7', ',', ' ', '5', '7', ']', 67, 67]

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

Вы слишком много думаете. Вы можете просто сделать:

all_numbers = list(range(1,101))

extracted = random.choice(all_numbers)
all_numbers.remove(extracted)

Если хотите, вы можете циклически пройти последние две строки и также сохранить значения в списке:

all_numbers = list(range(1,101))
result =[]
for i in range(10):
    extracted = random.choice(all_numbers)
    result.append(extracted)
    all_numbers.remove(extracted)
0 голосов
/ 06 ноября 2019

Поскольку вы стираете файл, я предполагаю, что вам не нужно хранить его в течение длительного времени. Вы можете использовать набор, являющийся неизменной структурой и не допускающий повторения.

import random

lottery = set() #empty set

Допустим, вы хотите сгенерировать 6 чисел:

while len(lottery) < 7:

    lottery.add(random.randint(1,100)) #same method you used for random

print(lottery)
{6, 41, 75, 49, 85, 87, 61}

Если вам нужно запуститьмного раз, поместите его в функцию

def run_lottery():

    lottery = set()

        while len(lottery) < 7:
                lottery.add(random.randint(1,100)) #same method you used

    return lottery

и вызовите его с переменной:

  lucky = run_lottery()

  print(lucky)
  {100, 10, 13, 17, 49, 57, 63}
0 голосов
/ 06 ноября 2019

Здесь много чего не так. Во-первых, вы не можете просто записать список в текстовый файл, а затем прочитать его обратно как список, поэтому вы получаете странное поведение. Вы должны заглянуть в модуль под названием pickle. Во-вторых, как показывает только что появившийся ответ, вам не нужна вся эта сложность. Просто начните со списка всех чисел и используйте random.choice(), чтобы выбрать из него. В-третьих, лучше всего открывать текстовые файлы в блоке with, так как они будут закрыты должным образом в случае возникновения исключения.

with f as open('path','r'):
 f.read()
...