Python可以生成一个排除一组数字的随机数,而不使用递归吗?

31 python random recursion range

我查看了Python Docs(我可能已经误解了),但我没有看到有办法在不调用递归函数的情况下执行此操作(如下所示).
我想做的是生成一个随机值,它排除中间的值.

换句话说,
让我们想象一下,我想X成为一个不在的随机数
range(a - b, a + b)
我是否可以在第一次通过时执行此操作,

1.我是否必须不断生成一个数字,
2.检查是否range(),
3.冲洗?

至于为什么我不想写一个递归函数,
1.它'感觉'我不应该
2.我正在做的这组数字实际上可能最终变得非常大,并且
......我听说堆栈溢出很糟糕,我可能只是在做这个过于谨慎.

我确信这是一种很好的,Pythonic,非递归的方法.

Li-*_*Yip 41

生成一个随机数并将其映射到您想要的数字范围.

如果你想在1-4or 之间生成一个整数7-10,排除56,你可能会:

  1. 生成范围内的随机整数 1-8
  2. 如果随机数大于4,则添加2到结果中.

映射变为:

Random number:    1  2  3  4  5  6  7  8
Result:           1  2  3  4  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

这样做,你永远不需要"重新滚动".上面的示例适用于整数,但也可以应用于浮点数.

  • @AndrewG.: 谢谢.:)用几张照片可以解释得更好,但是我打开Visio的激活能量今晚有点高.;) (3认同)

Jun*_*uxx 29

使用random.choice().在此示例中,a是您的下限,跳过b和c之间的范围,d是您的上限.

import random
numbers = range(a,b) + range(c,d)
r = random.choice(numbers)
Run Code Online (Sandbox Code Playgroud)

  • 除非可能的答案集非常大,否则这将起作用,在这种情况下,它会占用太多内存并导致崩溃. (13认同)
  • 可能需要将其写为 `numbers = list(range(a,b)) + list(range(c,d))` (3认同)

Ken*_*Ken 9

一种可能的解决方案是将随机数移出该范围.例如

def NormalWORange(a, b, sigma):
    r = random.normalvariate(a,sigma)
    if r < a:
        return r-b
    else:
        return r+b
Run Code Online (Sandbox Code Playgroud)

这将产生具有范围(ab,a + b)中的孔的正态分布.

编辑:如果你想要整数,那么你将需要更多的工作.如果你想要在[c,ab]或[a + b,d]范围内的整数,那么下面的方法就可以了.

def RangeWORange(a, b, c, d):
    r = random.randrange(c,d-2*b) # 2*b because two intervals of length b to exclude
    if r >= a-b:
        return r+2*b
    else:
        return r
Run Code Online (Sandbox Code Playgroud)


zmo*_*zmo 7

我可能误解了你的问题,但是你可以在没有递归的情况下实现它

def rand(exclude):
    r = None
    while r in exclude or r is None:
         r = random.randrange(1,10)
    return r

rand([1,3,9])
Run Code Online (Sandbox Code Playgroud)

但是,在找到新结果之前,你仍然会循环结果.