我只是想知道如何让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)
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)
虽然其他答案是正确的。使用中间列表的效率很低。
替代解决方案:另一种方法是从大小为 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)
听起来好像你想产生一组随机的数字,然后从这些数字中一个一个地挑选。换句话说,没有重复的随机序列。
生成所有这些数字,洗牌,然后使用.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返回)。