如何创建随机范围,但排除特定数字?

How do you create a random range, but exclude a specific number?

我有以下代码:

while True:
    if var_p1 != "0":
        break
    else:
        import random
        var_p1 = random.randint(-5,5)

我希望循环重复直到 var_p1 不等于零。但是,我总是得到零。我做错了什么?

"0" != 0.

您正在与一个字符串进行比较,但是 randint 给您一个整数。

好吧,你检查一个字符串来打破循环。所以使用:

if var_p1 != 0:

而不是:

if var_p1 != "0":

一种从 a 生成到 b 但不包括值 c 的内存有效方法是:

r = random.randint(a, b - 1)
if r >= c:
    r += 1 

这样,在第一步中,我们将在 ac - 1 之间或 cb - 1 之间生成一个随机整数。在第二种情况下,我们递增 1,得到一个介于 c + 1b 之间的随机数。很容易看出 a..(c - 1)(c + 1)..b 之间的每个数字都有相同的概率。

您的代码失败,因为您将整数与字符串进行比较。您的代码还有其他问题:

  • 您在循环中有一个 import 语句。
  • 不知道你的循环会运行.
  • 多少次

这是一种无循环的方式,可以随机生成从 -5 到 +5(含)的非零整数。

import random
x = random.randint(1, 5)
if random.randrange(2) == 1:
  x = -x

此代码保证恰好调用 random.randrange 两次。

回答标题中的问题,而不是真正的问题(由 Daniel Roseman 回答):

如何创建随机范围,但排除特定数字?

使用random.choice:

import random
allowed_values = list(range(-5, 5+1))
allowed_values.remove(0)

# can be anything in {-5, ..., 5} \ {0}:
random_value = random.choice(allowed_values)  

作为替代方法,只需从数组中随机选择一个元素,[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]。保证只需一个电话即可工作。