我看着Python文档 (我可能误解了),但我没有看到,有一个办法做到这一点(看看下面),而不调用递归函数。
我想要做的是产生不包括中间值的随机值。
换一种说法,
让我们想象一下,我想X
是一个随机数,这不是在
range(a - b, a + b)
我能做到这一点在第一轮,
要么
1.我必须不断地生成一个号码,
2.检查是否在range()
3.清洗清洗?
至于为什么我不希望写一个递归函数,
1.这感觉就像'我不应该
2.一组数字,我做这实际上可能最终会是相当大的,而
......我听到栈溢出是坏的,我可能只是正在这样做过于谨慎。
我敢肯定,有一个漂亮的,Python化,非递归的方式来做到这一点。
Answer 1:
使用random.choice()。 在这个例子中,一个是你的下界,b和c之间的范围内被跳过,并且d是上限。
import random
numbers = range(a,b) + range(c,d)
r = random.choice(numbers)
Answer 2:
产生一个随机数,并将其映射到你想要的数字范围。
如果你想生成之间的整数1-4
或7-10
,不包括5
和6
,您可以:
- 生成在所述范围内的随机整数
1-8
- 如果随机数大于4,加入
2
到的结果。
映射变为:
Random number: 1 2 3 4 5 6 7 8
Result: 1 2 3 4 7 8 9 10
这样做,这样,你永远需要“重新卷”。 上面的例子是整数,但它也可以被应用到浮动。
Answer 3:
一个可能的解决方案是只是随机数移出该范围。 例如
def NormalWORange(a, b, sigma):
r = random.normalvariate(a,sigma)
if r < a:
return r-b
else:
return r+b
这将产生与在范围内的孔(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
Answer 4:
我可能误解了你的问题,但你可以实现这一点没有递归
def rand(exclude):
r = None
while r in exclude or r is None:
r = random.randrange(1,10)
return r
rand([1,3,9])
不过,你仍然遍历结果,直到你找到新的。
Answer 5:
最快的解决方案将是这样(a和b限定了隔离区C和D所设定好的答案,包括隔离区的):
offset = b - a
maximum = d - offset
result = random.randrange(c, maximum)
if result >= a:
result += offset
Answer 6:
你仍然需要一定范围内,即不包括你的中间值的最小-最大可能值。
你为什么不先随机挑选您想要的范围内的“半壁江山”,然后选择在该范围内的随机数? 例如:
def rand_not_in_range(a,b):
rangechoices = ((0,a-b-1),(a+b+1, 10000000))
# Pick a half
fromrange = random.choice(rangechoices)
# return int from that range
return random.randint(*fromrange)
Answer 7:
立昂业的回答让递归问题没有实际意义,但我必须指出,这是可以做到的递归任何程度,而不必担心堆栈。 这就是所谓的“尾递归”。 Python不直接支持尾递归,因为GVR认为它的酷:
http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html
但是你可以解决这个问题:
http://paulbutler.org/archives/tail-recursion-in-python/
我觉得有趣的是坚持认为递归“感觉不对”。 在极功能导向的语言,如计划,递归是不可避免的。 它可以让你做迭代,而无需创建状态变量,函数式编程范式严格避免。
http://www.pling.org.uk/cs/pop.html
文章来源: Can Python generate a random number that excludes a set of numbers, without using recursion?