привет, я пытаюсь использовать генератор доходности для генерации 6 случайных чисел, которые не дублируются случайными модулями с функцией random.randint в диапазоне (0-40) это большая часть кода для программы, но не весь он для сэкономить место.
# Imports
from colorama import init, Fore
init()
# variables
cor = 0
no = 0
acceptable_values = list(range(0, 41))
acceptable_values_15 = list(range(0, 16))
unacceptable_values = list()
unacceptable_values2 = list()
# user input for 6 non duplicate integers
while True:
try:
user1 = int(input(Fore.LIGHTRED_EX + 'Input your first number between 0-40: ' + Fore.RESET))
if user1 in acceptable_values:
print(Fore.LIGHTGREEN_EX + ' Input accepted!' + Fore.RESET)
unacceptable_values.append(user1)
break
else:
print(Fore.LIGHTYELLOW_EX + ' Number entered must be between 0-40!' + Fore.RESET)
continue
except ValueError:
print(Fore.LIGHTRED_EX + 'Invalid input!' + Fore.RESET)
(x6 for vars user1 though user6)
# the 7th number is a lucky number between 0-15
while True:
try:
user7 = int(input(Fore.LIGHTYELLOW_EX + 'Input your bonus seventh number between 0-15: ' + Fore.RESET))
if user7 in unacceptable_values:
print(Fore.LIGHTYELLOW_EX + "Input value has been entered before please select another number!" + Fore.RESET)
continue
elif user7 in acceptable_values_15:
print(Fore.LIGHTGREEN_EX + ' Input accepted!' + Fore.RESET)
break
else:
print(Fore.LIGHTYELLOW_EX + ' Number entered must be between 0-15!' + Fore.RESET)
continue
except ValueError:
print(Fore.LIGHTRED_EX + 'Invalid input!' + Fore.RESET)
# returns 6 random numbers between 0 and 40 with no duplicates.
def lottery():
import random
for i in range(6):
yield random.randint(0, 41)
unacceptable_values2.append(random_number)
if random_number in unacceptable_values2:
continue
# checks random numbers against user inputs 1-7 to see if they match and tallies the results
for random_number in lottery():
print(Fore.LIGHTCYAN_EX + "\nAnd the next number is... %d!" % random_number + Fore.RESET)
if random_number == user1:
print(Fore.LIGHTGREEN_EX + ' Input #1 number %s was correct!' % user1 + Fore.RESET)
cor += 1
elif random_number == user2:
print(Fore.LIGHTGREEN_EX + ' Input #2 number %s was correct!' % user2 + Fore.RESET)
cor += 1
elif random_number == user3:
print(Fore.LIGHTGREEN_EX + ' Input #3 number %s was correct!' % user3 + Fore.RESET)
cor += 1
elif random_number == user4:
print(Fore.LIGHTGREEN_EX + ' Input #4 number %s was correct!' % user4 + Fore.RESET)
cor += 1
elif random_number == user5:
print(Fore.LIGHTGREEN_EX + ' Input #5 number %s was correct!' % user5 + Fore.RESET)
cor += 1
elif random_number == user6:
print(Fore.LIGHTGREEN_EX + ' Input #6 number %s was correct!' % user6 + Fore.RESET)
cor += 1
elif random_number == user7:
print(Fore.LIGHTYELLOW_EX + ' Input #7 number %s was correct!' % user7 + Fore.RESET)
cor += 1
else:
print(Fore.LIGHTRED_EX + ' None of your inputs match this selected number!' + Fore.RESET)
no += 1
# printing # of correct and wrong
print(Fore.LIGHTGREEN_EX + '\n\nYou got %s numbers correct!' % cor + Fore.RESET)
print(Fore.LIGHTRED_EX + '\nYou got %s numbers wrong!' % no + Fore.RESET)
блок кода, с которым у меня возникают проблемы, это этот блок:
def lottery():
import random
# returns 6 numbers between 0 and 40 with no duplicates.
for i in range(6):
yield random.randint(0, 41)
unacceptable_values2.append(random_number)
if random_number in unacceptable_values2:
continue
У меня есть несколько идей относительно того, что на самом деле будет делать этот код, но я не знаю, каков будет фактический результат, когда будет найден дубликат.
мое первое предположение состоит в том, что код просто сгенерирует 6 случайных чисел и отобразит их независимо от того, является ли число дубликатом. (не желаемый результат, но, вероятно, наиболее вероятный результат)
мое второе предположение заключается в том, что из-за продолжения он просто будет продолжать генерировать 6 чисел, если будет найден дубликат, пока не получит 6 чисел без дубликатов и не перейдет к следующему блоку (желательный результат, но неэффективный, поскольку он будет продолжать генерировать все 6 чисел снова и снова, пока у него не будет дубликатов)
мое третье предположение заключается в том, что он будет генерировать случайные числа, сообщая, что он сталкивается с дубликатом, и просто регенерирует этот один повторяющийся номер, говоря, что он больше не является дубликатом, а затем переходит к следующему блоку. (мой желаемый результат, так как это, вероятно, самый эффективный результат, но также маловероятный результат)
мое четвертое предположение состоит в том, что он сгенерирует 6 чисел, найдет дубликат и отбросит его и продолжит оставлять мне результат с 5 случайными неповторяющимися числами вместо 6 (не желаемый результат, так как мне нужен диапазон из 6 случайных не повторяющихся чисел, чтобы это сработало, но, как говорится, я думаю, что этот результат действительно маловероятен, поскольку он, вероятно, не отбросит дубликат, если он будет найден)
то, что я хотел бы сделать, это третий вариант, где, когда он находит повторяющийся номер, он просто отбрасывает дубликат и повторно дает новый неповторяющийся номер на своем месте
я пытаюсь сделать это как можно более читабельным, используя функцию yield и random.randint без RE, частичных или каких-либо запутанных методов, поскольку я хочу, чтобы это было как можно проще для друга, который плохо знаком с python, чтобы легко мог читать и понимать код
Есть специальная функция для сэмплирования без замены. Вы специально его избегаете или просто не знали, что он есть?
не избегал образца, просто забыл, что он по какой-то причине предотвратил дублирование, лол, и я мог бы сдаться и добавить в чек, и это сработало бы, лол, это было безумно поздно, я, вероятно, не ясно думал, спасибо и за это тоже






random.sample() идеально подходит для этого:
import random
def lottery():
yield from random.sample(range(41), k=6)
спасибо, что напомнил мне, чувак, я знал о методе random.sample, я просто не думал, что он предотвратит дублирование по какой-то причине, я забыл эту часть, лол, я просто перечитал документацию по нему и, конечно же, он говорит, что он не дублирует результаты - - - random.sample(seq, n) Генерировать n уникальных выборок (несколько элементов) из последовательности без повторения. Здесь seq может быть списком, набором, строкой, кортежем. Образец без замены.
Разве ваш yield и append не должны быть в вашей проверке if? То есть выдавать случайное число только в том случае, если оно еще не было сгенерировано, и добавлять его к неприемлемым числам.