Как выбрать случайное значение из массива, затем снова выбрать случайно, исключая только что выбранное значение? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать комбинацию уникальных фраз, чтобы составить предложение, и хочу случайным образом выбрать длину фразы из S (требуется только 1 раз), а затем случайным образом выбрать сначала значение J, а затем случайный Qзначение, но я не хочу, чтобы выбрано то же значение из J или S.Как я могу это сделать?

Вот как выглядят некоторые примеры выходных данных:

I3 и I1 I4 не I5 I5 или I4 и I3 не I3

Q=("but","why","okay")
J=("J1","J2","J3","J4","J5")
S=[(J), (J,Q,J), (J,Q,J,Q,J),(J,Q,J,Q,J,Q,J)]

' '.join([random.choice(i) for i in random.choice(S)])

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Перемешайте оба массива, затем берите элементы по мере необходимости, один за другим. Или попробуйте их, если вы не хотите, чтобы оригиналы возмущались:

Q=("but","why","okay")
J=("J1","J2","J3","J4","J5")
S=[(J,), (J,Q,J), (J,Q,J,Q,J), (J,Q,J,Q,J,Q,J)]

from random import sample, choice
from collections import Counter

seq = choice(S)
iters = { s: iter(sample(s, c)) for s, c in Counter(seq).items() }
result = ' '.join(next(iters[s]) for s in seq)

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

0 голосов
/ 30 мая 2019

Надеюсь, это поможет

result = []
temp = S
while temp is not empty:
   random1 = random.choice(temp)
   value = random.choice(random1)
   result.append(value)
   temp2 = random1.remove(value)
   temp = temp.remove(random1)
   if temp2 is not empty:
      temp = temp.append(temp2)

print(' '.join(result))

Ключевая идея заключается в том, что мы удалим выбранное значение до следующего случайного

...