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

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

Вот код. Он никогда не должен печатать те же две вещи, что и я, но иногда это происходит. Дело в том, что 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() =)

  • Создание случайного числа в кольцевом пространстве
  • Случайные строки Python из подпапок
  • Можно ли считать отсутствие заказа Python случайным порядком?
  • Какова точная природа различий или сходства между random.setstate () и random.seed ()
  • Как создать случайное число заданной десятичной точки между 2-мя цифрами в Python?
  • Set.pop () не является случайным?
  • Выберите случайный элемент с весом
  • Python удаляет элемент из случайного списка, после его выбора
  • Случайный словарь словаря Python, взвешенный по значениям
  • Python - случайная выборка из диапазона, избегая определенных значений
  • Python: почему `random.randint (a, b)` возвращает диапазон, включающий `b`?
  • Python - лучший язык программирования в мире.