31 python random recursion range
我查看了Python Docs(我可能已经误解了),但我没有看到有办法在不调用递归函数的情况下执行此操作(如下所示).
我想做的是生成一个随机值,它排除中间的值.
换句话说,
让我们想象一下,我想X
成为一个不在的随机数
range(a - b, a + b)
我是否可以在第一次通过时执行此操作,
或
1.我是否必须不断生成一个数字,
2.检查是否range()
,
3.冲洗?
至于为什么我不想写一个递归函数,
1.它'感觉'我不应该
2.我正在做的这组数字实际上可能最终变得非常大,并且
......我听说堆栈溢出很糟糕,我可能只是在做这个过于谨慎.
我确信这是一种很好的,Pythonic,非递归的方法.
Li-*_*Yip 41
生成一个随机数并将其映射到您想要的数字范围.
如果你想在1-4
or 之间生成一个整数7-10
,排除5
和6
,你可能会:
1-8
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)
这样做,你永远不需要"重新滚动".上面的示例适用于整数,但也可以应用于浮点数.
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)
一种可能的解决方案是将随机数移出该范围.例如
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)
我可能误解了你的问题,但是你可以在没有递归的情况下实现它
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)
但是,在找到新结果之前,你仍然会循环结果.