我这里有一个返回4位数字符串的函数。问题是,当我运行500次或更多次的函数时,它开始返回重复项。如何避免?
我的功能:
import random
def CreatePass():
Num = str(random.randint(1000, 9999)
return Num
答案 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编码标准。