-5

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

我的功能:

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

4 回答 4

11

每次调用函数时生成一个列表,将其打乱并从中弹出:

import random

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

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

于 2013-06-21T21:05:56.060 回答
2

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

selected = random.sample(xrange(100000, 1000000), 500)
于 2013-06-21T21:20:21.347 回答
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...

StopIteration不过,当它筋疲力尽时,你会得到一个......

于 2013-06-21T21:06:40.470 回答
0

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

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

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

最后,您可以生成整个序列,然后对其进行随机播放。

当然,你需要弄清楚一旦你用尽了可能的返回值该怎么做,以及一旦只有少量可能的返回值时的行为是否真的是可取的。

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

于 2013-06-21T21:07:22.813 回答