在numpy中,如何从排除先前选择的随机数的范围中随机选择一个数字?

时间:2017-06-12 20:01:27

标签: python numpy random

例如:

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),我应该使用哪些命令?

3 个答案:

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