如何从数组中选择随机值,然后在不选择刚刚选择的值的情况下再次随机选择?

时间:2019-05-30 01:50:48

标签: python numpy random

我正在尝试创建唯一短语的组合来构成一个句子,并希望从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 个答案:

答案 0 :(得分:1)

将两个数组随机排列,然后根据需要采用元素,一个接一个。如果您不想干扰原件,请尝试以下方法:

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)

所以我首先选择所需的序列。然后,我计算每个列表按所选顺序出现多少次。然后,对于每个唯一列表,我将选择与列表中出现的序列一样多的随机元素(无重复),然后为这些选择进行迭代,这样我就可以一一获得。剩下要做的最后一件事是迭代序列,并从适当的迭代器中获取下一个元素。

答案 1 :(得分:0)

我希望对您有帮助

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))

关键思想是我们将在下一个随机变量之前删除所选值