我只是想知道如何让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
答案 0 :(得分:6)
在列表中使用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]
答案 1 :(得分:4)
听起来好像你想要产生一组随机的数字,然后从那些一个一个地挑选。换句话说,一个没有重复的随机序列。
生成所有这些数字,随机播放,然后使用.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
)。
答案 2 :(得分:0)
在这种情况下,random.choice
可以正常工作,但也可以使用明显的简单数学变换。如果玩家编号为0到5(包括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()
或类似),直到它为空是可行的方法。然后,您可以重新填充并重新洗牌以获得新的(但不同的)“公平”订单。
(请注意,这就是为什么在开始“如何到达那里”之前弄清楚你想要什么很重要。)
答案 3 :(得分:0)
想法是。从LIST(A)中选择随机数每次从LIST(A)中选择随机数时,LIST(A)都会变小。所以你不能重复。如果Python第一次显示“ 2”。它不能第二次这样做,因为LIST(A)中没有'2'...
import random
random_numbers = [1,2,3,4,5]
X = []
while True:
one = random.choice(random_numbers))
# print(one)
if str(one) not in X:
X.append(str(one))
break
if '2' in X:
print("Last number was 2 with out repeating!")
print("You did it u pick random numbers one by one with out repeating")
random_numbers.remove(one)
print(X)
答案 4 :(得分:0)
其他答案正确时。
您可以执行此操作的另一种方法是,从大小为n-1的数字范围中随机选择。然后+1等于> =您要跳过的数字的任何结果。
import numpy as np
def random_choice_except(a, size, excluding, replace=False):
choices = np.random.choice(a-1, size, replace=replace)
return choices + (choices >= excluding)