除了python的特定数字之外,选择随机整数?

use*_*540 6 python random

我只是想知道如何让python生成除特定数字之外的随机数?例如,我希望它从1-5生成任何数字,除了3,因此输出将是1,2,4,并且3将不会计入列表中.我怎么做?非常感谢

一个例子是游戏中有5个玩家,玩家1-4是计算机化的.我需要玩家1随机选择其他玩家(除了自身)和玩家2-4来做同样的事情.

所以输出将是这样的:

Player 1, who do you want to play with?
Player 1 chooses Player 2
Run Code Online (Sandbox Code Playgroud)

Ash*_*ary 8

random.choice在列表中使用,但首先从列表中删除该特定数字:

>>> import random
>>> n = 3
>>> end  = 5
>>> r = range(1,n) + range(n+1, end)
>>> r
[1, 2, 4]
>>> random.choice(r)
2
>>> random.choice(r)
4
Run Code Online (Sandbox Code Playgroud)

或者定义一个函数:

def func(n, end, start = 1):
    return range(start, n) + range(n+1, end)
... 
>>> r = func(3, 5)
>>> r
[1, 2, 4]
>>> random.choice(r)
2
Run Code Online (Sandbox Code Playgroud)

更新:

这将返回列表中除特定数字以外的所有数字:

>>> r = range(5)
for player in r:
    others = range(0, player) + range(player+1, 5)
    print player,'-->', others
...     
0 --> [1, 2, 3, 4]
1 --> [0, 2, 3, 4]
2 --> [0, 1, 3, 4]
3 --> [0, 1, 2, 4]
4 --> [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 或者`[x表示x中的x(1,5)如果x!= 3]` (3认同)
  • 对于 python3,你不能在范围之间执行“+”。它应该是 `r = list(range(1,n)) + list(range(n+1, end))` (来源:[Python - 不支持的类型:范围和范围](https://stackoverflow .com/a/13318111/7053344)) (2认同)

Nat*_*han 7

虽然其他答案是正确的。使用中间列表的效率很低。


替代解决方案:另一种方法是从大小为 n-1 的数字范围中随机选择。然后对大于或等于您要跳过的数字的任何结果添加 +1。

以下函数random_choice_except实现与 相同的 API np.random.choice,因此调整size可以有效生成多个随机值:


import numpy as np

def random_choice_except(a: int, excluding: int, size=None, replace=True):
    # generate random values in the range [0, a-1)
    choices = np.random.choice(a-1, size, replace=replace)
    # shift values to avoid the excluded number
    return choices + (choices >= excluding)

random_choice_except(3, 1)
# >>> 0  <or>  2  
random_choice_except(3, 1, size=10)
# >>> eg. [0 2 0 0 0 2 2 0 0 2]
Run Code Online (Sandbox Code Playgroud)

行为的np.random.choice变化取决于是否将整数、列表或数组作为参数传递。为了防止不必要的行为,我们可能需要在函数顶部添加以下断言:assert isinstance(a, int)


Mar*_*ers 5

听起来好像你想产生一组随机的数字,然后从这些数字中一个一个地挑选。换句话说,没有重复的随机序列。

生成所有这些数字,洗牌,然后使用.pop()一次选择一个并将其从一组可能性中删除:

import random

numbers = range(5)  # list(range(5)) in Python 3
random.shuffle(numbers)

a_random_number = numbers.pop()
another_random_number = numbers.pop()
Run Code Online (Sandbox Code Playgroud)

list.pop() 从随机打乱的数字列表中删除最后一个值。

甚至只是洗牌然后循环遍历列表可能就足够了:

players = range(5)
random.shuffle(players)

for player in players:
    # random ordering of players
Run Code Online (Sandbox Code Playgroud)

您可以将随机数序列产生式捆绑为函数中的迭代器:

import random

def random_number_sequence(n):
    numbers = range(n)  # list(range(n)) in Python 3
    random.shuffle(numbers)
    return iter(numbers)

random_sequence = random_number_sequence(5)
a_random_number = next(numbers)
another_random_number = next(numbers)
Run Code Online (Sandbox Code Playgroud)

您可以调用next()迭代器,它会从序列中生成另一个随机数,直到序列耗尽(此时StopIteration返回)。