Python可以生成排除了一组数字,不使用递归的随机数?(Can Python generate a

2019-07-29 11:25发布

我看着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-47-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

这样做,这样,你永远需要“重新卷”。 上面的例子是整数,但它也可以被应用到浮动。



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?