修复一个函数随时间返回重复?

时间:2013-06-21 21:03:59

标签: python random

我这里有一个返回4位数字符串的函数。问题是,当我运行500次或更多次的函数时,它开始返回重复项。如何避免?

我的功能:

import random
def CreatePass():
    Num = str(random.randint(1000, 9999)
    return Num

4 个答案:

答案 0 :(得分:11)

生成一个列表,每次调用该函数时将其随机播放并弹出:

import random

def CreatePass(_numbers=[]):
    if not _numbers:
        _numbers[:] = range(1000, 10000)
        random.shuffle(_numbers)              
    return str(_numbers.pop())

请注意,这会在您用完后重新生成_numbers列表,但之后您已经用尽了所有8999个可能的数字,并且无论如何都必须接受重复。

答案 1 :(得分:2)

可以自己滚动,希望不要用尽它:

from random import shuffle
def myrandom(start, end):
    possible = range(start, end)
    shuffle(possible)
    for i in possible:
        yield str(i)

randoms = myrand(1000, 9999)
print next(randoms)
print next(randoms)
# etc...

虽然...... {/ p>已经筋疲力尽了,但你会得到StopIteration

答案 2 :(得分:2)

@ Martijn的解决方案已经足够,因为您只需要存储和随机播放9000个号码。如果你想要更大范围的数字并且你知道(大约)你需要多少个数字,那么有一个更好的方法:函数random.sample将给你所需范围without重复的数字。例如,要获得500个不同的六位数字,您可以使用:

selected = random.sample(xrange(100000, 1000000), 500)

答案 3 :(得分:0)

没有重复的随机序列不是随机的。

您可以通过增加可能值的范围来降低重复的可能性。

或者,您可以记录以前的返回值,如果先前已返回,则选择一个新值。

最后,你可以生成整个序列,然后将其洗牌。

当然,一旦你用完了可能的返回值,你就需要弄清楚要做什么,以及一旦只有少量可能的返回值的行为是否真的很理想。

此外,您应该遵守标准的Python编码标准。