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

2024-05-12 12:52:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道如何让python生成特定数字以外的随机数?例如,我希望它生成1到5之间除3之外的任何数字,因此输出将是1, 2, 4, 5,并且3将不计入列表中。我能做些什么来实现这个目标?

例如:
一个游戏中有五个计算机化的玩家(玩家0到4)。
玩家1随机选择一个其他玩家(除了自己)和玩家2到4将做同样的事情。

所以输出结果如下:

Player 1, who do you want to play with?
Player 1 chooses Player 2

Tags: toyou游戏目标列表playwith玩家
3条回答

在这种情况下,random.choice可以很好地工作,但是也可以使用一个明显的简单数学转换。如果玩家编号为0到5,且您是玩家X,则:

number = random.choice(0, 4) # first, pick a number: 0, 1, 2, 3, or 4
if number >= X:              # then, if it's me or higher...
    number += 1              # move forward one player

请注意,无论你是哪个玩家,这都有效。如果你是5,这会选择一个介于0和4之间的数字,而不是你(因为你是5)。如果您是#0,这将选择一个介于0和4之间的数字,即>;=您(因为您是#0),因此您添加1以给出介于1和5之间的数字。如果你是3,这个选择一个介于0和4之间的数字,如果是3或4,你将它分别增加1到4或5。

编辑补充:这将不允许你做“公平”的交替(每个人都得到一个回合之前,有人得到再次去)。如果需要,可以生成一个列表,使用random.shuffle将其按随机顺序排列,然后从列表(使用.pop()或类似的)中挑选,直到它为空。然后,您可以重新填充和重新洗牌新的(但不同的)“公平”秩序的名单。

(注意,这就是为什么在开始“如何到达那里”之前,先弄清楚你想要什么是很重要的。)

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

生成所有这些数字,洗牌,然后使用.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()

list.pop()从随机洗牌号码列表中删除最后一个值。

它甚至可以在列表上循环播放:

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

for player in players:
    # random ordering of players

您可以将随机数序列产品打包为函数中的迭代器:

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)

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

在列表中使用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

或者定义一个函数:

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

更新:

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

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

相关问题 更多 >