Python 3: использование генератора доходности с random.randint для генерации случайных целых чисел в диапазоне (0-40), которые не дублируются в диапазоне 6

привет, я пытаюсь использовать генератор доходности для генерации 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, чтобы легко мог читать и понимать код

Разве ваш yield и append не должны быть в вашей проверке if? То есть выдавать случайное число только в том случае, если оно еще не было сгенерировано, и добавлять его к неприемлемым числам.

B Remmelzwaal 17.06.2023 10:16

Есть специальная функция для сэмплирования без замены. Вы специально его избегаете или просто не знали, что он есть?

user2357112 17.06.2023 11:37

не избегал образца, просто забыл, что он по какой-то причине предотвратил дублирование, лол, и я мог бы сдаться и добавить в чек, и это сработало бы, лол, это было безумно поздно, я, вероятно, не ясно думал, спасибо и за это тоже

john poe 17.06.2023 16:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

random.sample() идеально подходит для этого:

import random

def lottery():
    yield from random.sample(range(41), k=6)

спасибо, что напомнил мне, чувак, я знал о методе random.sample, я просто не думал, что он предотвратит дублирование по какой-то причине, я забыл эту часть, лол, я просто перечитал документацию по нему и, конечно же, он говорит, что он не дублирует результаты - - - random.sample(seq, n) Генерировать n уникальных выборок (несколько элементов) из последовательности без повторения. Здесь seq может быть списком, набором, строкой, кортежем. Образец без замены.

john poe 17.06.2023 16:48

Другие вопросы по теме