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

Python 如何创建一个随机范围,但排除一个特定的数字?,python,if-statement,random,while-loop,range,Python,If Statement,Random,While Loop,Range,我有以下代码: 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: 而不是:

我有以下代码:

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 

这样,在第一步中,我们将在
a
c-1
之间或
c
b-1
之间生成一个随机整数。在第二种情况下,我们增加1,得到一个介于
c+1
b
之间的随机数。很容易看出
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回答):

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

使用:


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

您了解“0”和“0”之间的区别吗?至少在Python中是这样?不太可能。。。。我一直在慢慢地用在线教程等来教自己。但是我不记得正确解释了其中的区别……嗯。我认为这一部分留给用户理解。无论如何,请记住,在python中,单引号/双引号内的任何内容都是字符串。例如:x=“1234”是字符串(不是整数/数字),但x=1234是整数值(数字)。如果你还不清楚的话,我会做进一步的解释。我看不出5后面+1的原因。为什么不能使用(-5,5)?您需要
范围(5,6)
,因为范围不包括正确的边界。请参阅此代码对
random
函数进行了最佳调用次数,因此它(可能)是最有效的,假设
允许的_值不会在循环中生成(例如,如果它是作为随机数发生器函数中的局部变量生成的)。感谢您提到
import
应该位于脚本顶部。将其放入循环本身并不是一个错误,后续尝试导入同一个模块将不会产生任何效果,但它的风格仍然很差。是的,无法知道OP代码中的循环将运行多少次。但是,每个返回的数字的预期值为1.1个循环,即,要返回1000个数字,通常会生成1100个随机数。因此,虽然OP算法的运行时间是不确定的,但实际上并没有那么糟糕,因为您的算法和JUnitorCompressor都需要生成2000个随机数才能返回1000个结果。是的,您是对的。期望值1.1比保证值2好。亲爱的未来之人:JuniorCompressor的代码已更改,因此我前面的评论不再适用于它。:)我本打算提出这种方法,但我认为使用
选项
更好,因为它避免了
if
。。。但驼鹿击败了我,提交了答案事实上,正如我在对Moose答案的评论中提到的,如果你在函数中本地创建它,生成随机数,那是非常浪费的。通常,我会在全局上下文中创建它(作为元组),就在随机数发生器函数定义的上方。@JUnitorCompressor我想choice的优点是每个元素的绘制概率相同。令人恼火的是,文档中没有说明这一点。@moose Yes两种方法给出的概率相同。我认为,当您的数据不遵循某个模式,并且您的空间没有问题时,选择当然是非常好的。否则,您可能会存储一百万个整数来选择一个随机整数,因为您只需要一个异常。
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)