选择除 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

原文由 bugbytes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

在列表中使用 random.choice ,但首先从列表中删除该特定号码:

 >>> import random
>>> n = 3
>>> end  = 5
>>> r = list(range(1,n)) + list(range(n+1, end))
>>> r
[1, 2, 4]
>>> random.choice(r)
2
>>> random.choice(r)
4

或者定义一个函数:

 def func(n, end, start = 1):
    return list(range(start, n)) + list(range(n+1, end))
...
>>> r = func(3, 5)
>>> r
[1, 2, 4]
>>> random.choice(r)
2

更新:

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

 >>> r = range(5)
for player in r:
    others = list(range(0, player)) + list(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]

原文由 Ashwini Chaudhary 发布,翻译遵循 CC BY-SA 4.0 许可协议

而其他答案是正确的。使用中间列表效率低下。


备选解决方案:另一种方法是从大小为 n-1 的数字范围内随机选择。然后将 +1 添加到大于或等于 >= 您要跳过的数字的任何结果。

以下函数 random_choice_except 实现与 np.random.choice 相同的 API,因此调整 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]


np.random.choice 的行为根据是否将整数、列表或数组作为参数传递而改变。为了防止不必要的行为,我们可能希望在函数顶部添加以下断言: assert isinstance(a, int)

原文由 Nathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题