2024-05-12 12:52:19 发布
网友
我只是想知道如何让python生成特定数字以外的随机数?例如,我希望它生成1到5之间除3之外的任何数字,因此输出将是1, 2, 4, 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
在这种情况下,random.choice可以很好地工作,但是也可以使用一个明显的简单数学转换。如果玩家编号为0到5,且您是玩家X,则:
random.choice
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()或类似的)中挑选,直到它为空。然后,您可以重新填充和重新洗牌新的(但不同的)“公平”秩序的名单。
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()从随机洗牌号码列表中删除最后一个值。
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)。
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]
在这种情况下,
random.choice
可以很好地工作,但是也可以使用一个明显的简单数学转换。如果玩家编号为0到5,且您是玩家X,则:请注意,无论你是哪个玩家,这都有效。如果你是5,这会选择一个介于0和4之间的数字,而不是你(因为你是5)。如果您是#0,这将选择一个介于0和4之间的数字,即>;=您(因为您是#0),因此您添加1以给出介于1和5之间的数字。如果你是3,这个选择一个介于0和4之间的数字,如果是3或4,你将它分别增加1到4或5。
编辑补充:这将不允许你做“公平”的交替(每个人都得到一个回合之前,有人得到再次去)。如果需要,可以生成一个列表,使用
random.shuffle
将其按随机顺序排列,然后从列表(使用.pop()
或类似的)中挑选,直到它为空。然后,您可以重新填充和重新洗牌新的(但不同的)“公平”秩序的名单。(注意,这就是为什么在开始“如何到达那里”之前,先弄清楚你想要什么是很重要的。)
听起来好像你想产生一组随机的数字,然后从中一个一个地挑选。换句话说,没有重复的随机序列。
生成所有这些数字,洗牌,然后使用
.pop()
一次选择一个并将其从一组可能性中移除:list.pop()
从随机洗牌号码列表中删除最后一个值。它甚至可以在列表上循环播放:
您可以将随机数序列产品打包为函数中的迭代器:
您可以在迭代器上调用
next()
,它将从序列中产生另一个随机数,直到序列耗尽(此时返回StopIteration
)。在列表中使用
random.choice
,但首先要从列表中删除该特定数字:或者定义一个函数:
更新:
这将返回列表中除特定数字以外的所有数字:
相关问题 更多 >
编程相关推荐