例如:
open_door = np.random.randint(1,4)
prize_behind_door = np.random.randint(1,4)
change_door = np.random.randint(1,4)
但我不希望change_door的值与open_door相同,但它仍然是随机的(因此它可以等于prize_behind_door),我应该使用哪些命令?
答案 0 :(得分:0)
使用np.setdiff1d
设置排除open_door
的范围,然后使用np.random.choice
从中选择一个随机元素 -
np.random.choice(np.setdiff1d(range(1,4), open_door))
样品运行 -
In [329]: open_door = np.random.randint(1,4)
...: prize_behind_door = np.random.randint(1,4)
...:
In [330]: open_door
Out[330]: 2
In [331]: prize_behind_door
Out[331]: 1
In [349]: np.setdiff1d(range(1,4), open_door) # array that excludes open_door
Out[349]: array([1, 3])
In [332]: np.random.choice(np.setdiff1d(range(1,4), open_door))
Out[332]: 1
In [333]: np.random.choice(np.setdiff1d(range(1,4), open_door))
Out[333]: 3
In [334]: np.random.choice(np.setdiff1d(range(1,4), open_door))
Out[334]: 3
In [335]: np.random.choice(np.setdiff1d(range(1,4), open_door))
Out[335]: 3
In [336]: np.random.choice(np.setdiff1d(range(1,4), open_door))
Out[336]: 1
答案 1 :(得分:0)
choice
没有replace
怎么样?
In [230]: np.random.choice(range(1,4),2, replace=False)
Out[230]: array([2, 3])
In [231]: np.random.choice(range(1,4),2, replace=False)
Out[231]: array([2, 3])
In [232]: np.random.choice(range(1,4),2, replace=False)
Out[232]: array([1, 3])
In [233]: np.random.choice(range(1,4),2, replace=False)
Out[233]: array([1, 2])
In [234]: np.random.choice(range(1,4),2, replace=False)
Out[234]: array([3, 2])
In [235]: np.random.choice(range(1,4),2, replace=False)
Out[235]: array([3, 2])
In [236]: open_door, change_door = np.random.choice(range(1,4),2, replace=False)
...:
In [237]: open_door
Out[237]: 3
In [238]: change_door
Out[238]: 1
2个值将是随机的,但总是不同的。此选择将独立于prize_behind_door
。
对于像这样的小范围内的2个值,Python random
模块即使不是更好也会一样好(快速时间测试表明它更快):
random.sample(range(1,4),2)
答案 2 :(得分:0)
我会使用while循环
open_door = np.random.randint(1,4)
prize_behind_door = np.random.randint(1,4)
while True:
x = np.random.randint(1,4)
if x != open_door:
change_door = x
break
如果要删除多个值,只需添加到if语句
即可if x != value_1 and x != value_2:
value_3 = x
break
另一种方法是创建一个与随机数范围相同的bool数组。
如果带有所选数字索引的bool数组的值为False,则表示尚未选择该值,如果该值为真,则表示该值已为。
在while循环中检查是否通过获取bool_array [selected_number]的结果来选择值。如果它已被忽略并选择了一个新数字,否则将该值附加到您用来表示值的数组,并将bool数组的值设置为该数字的索引为True表示它现在已被选中
我会在函数内执行此操作以保持组织有序
from random import randint
def select_random_numbers(rand_range, values):
temp_list = []
isPicked = [False for _ in range(rand_range)]
for i in range(values):
while True:
x = randint(0, rand_range - 1)
if isPicked[x] == False:
temp_list.append(x)
isPicked[x] = True
break
return(temp_list)
print(select_random_numbers(10, 5))