Попытка создать серию уникальных случайных чисел

Извините, если это очевидно, я довольно новый.

Вот код. Он никогда не должен печатать те же две вещи, что и я, но иногда это происходит. Дело в том, что p1, равное 1, должно помешать p2 быть 1, а если p2 равно 1, p2 должен снова запускаться с тем же значением p1, но должен генерировать новое случайное число. Это может быть 1 снова, но тогда функция должна просто продолжать возвращаться и работать, пока они не будут разными, не так ли?

#Random Test with Exclusion P1Item = 'Empty' P2Item = 'Empty' import random import time def P1(): global P1Item global P2Exclusion P1Local = random.randint(1,3) if P1Local == 1: P1Item = 'Candy' P2(P1Local) elif P1Local == 2: P1Item = 'Steak' P2(P1Local) elif P1Local == 3: P1Item = 'Vegetables' P2(P1Local) def P2(A): global P2Item P2Local = random.randint(1,3) if P2Local == 1 and A != 1: P2Item = 'Candy' elif P2Local == 2 and A != 2: P2Item = 'Steak' elif P2Local == 3 and A != 3: P3Item = 'Vegetables' else: B = A P2(B) def Test(): print('Test') print('Define') P1() print(P1Item + ' ' + P2Item) time.sleep(1) input() Test() Test() 

4 Solutions collect form web for “Попытка создать серию уникальных случайных чисел”

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

 import random choices = ['Candy', 'Steak', 'Vegetables'] random.shuffle(choices) item1, item2 = choices[:2] 

Поскольку мы сначала перетасовали список возможных вариантов, а затем выбрали первые два, вы можете гарантировать, что item1 и item2 никогда не будут равны друг другу.

Использование random.shuffle() оставляет опцию открытой для выполнения чего-либо с остальными вариантами; у вас здесь всего 1, но в большом наборе вы можете продолжать выбирать предметы, которые пока не выбраны:

 choices = list(range(100)) random.shuffle(choices) while choices: if input('Do you want another random number? (Y/N)' ).lower() == 'n': break print(choices.pop()) 

даст вам 100 случайных чисел без повторения.

Если вам нужно всего лишь случайный random.sample() из 2, вместо этого используйте random.sample() :

 import random choices = ['Candy', 'Steak', 'Vegetables'] item1, item2 = random.sample(choices, 2) 

Вы можете использовать random модуль в Python для выполнения тяжелой работы для вас, в частности random.sample() :

 >>> import random >>> random.sample(['candy', 'steak', 'vegetable'], 2) ['vegetable', 'steak'] 

если вы хотите сохранить исходную логику, вот несколько псевдокодов:

 while(P2Local == A) P2Local = random.randint(1,3) 
 from random import choice x = ['foo','bar','fight'] num_uniq = 2 uniq_rand = set() while len(uniq_rand) < num_uniq: uniq_rand.add(choice(x)) print uniq_rand 

Как отметил @Martijn, это не так эффективно, как random.sample() =)

Interesting Posts

Добавление базы данных в проект Django с использованием Sqlite3 с Python 2.7

Настройка флажка для правильной загрузки загрузочных файлов js и css

Запрошенные модули недоступны: vtkRenderingOpenGL-cmake / OpenCVDetectVTK.cmake: 6 (find_package)

как писать установщик (установка python, модулей python и других зависимостей) для оконных окон?

Как установить конкретное место загрузки в Mozilla – веб-драйвер Marionette?

Как (с перерывами) пропускать определенные ячейки при работе с IPython ноутбуком?

Предоставление файла iCal .ics с помощью Django: исправление неправильных строк перевода строки

Разбор SQL с Python

Ошибка при вводе словаря в файл

Разница по дате между последовательными строками – Pyspark Dataframe

Элемент больше не привязан к DOM и исключениям времени ожидания

Вызов приложения из subprocess.call с аргументами

Разделение строк в требуемом формате, Pythonic? (с или без Regex)

Pygame (Python) – TypeError: Аргумент должен быть прямым объектом стиля

scrapy, как отправить несколько запросов в форму

Python - лучший язык программирования в мире.