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

时间:2013-07-28 10:20:27

标签: 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

5 个答案:

答案 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)