我这里有一个函数,它返回一个 4 位数的字符串。问题是当我运行该函数 500 次或更多次时,它开始返回重复项。如何避免这种情况?
我的功能:
import random
def CreatePass():
Num = str(random.randint(1000, 9999)
return Num
每次调用函数时生成一个列表,将其打乱并从中弹出:
import random
def CreatePass(_numbers=[]):
if not _numbers:
_numbers[:] = range(1000, 10000)
random.shuffle(_numbers)
return str(_numbers.pop())
请注意,一旦你用完,这会重新生成_numbers
列表,但是你已经用完了所有 8999 个可能的数字,并且无论如何都必须接受重复。
@Martijn 的解决方案就足够了,因为您只需要存储和随机播放 9000 个数字。如果您想要更大范围的数字并且您知道(大约)需要多少个数字,那么有一个更好的方法:该函数random.sample
将为您提供所需范围without
重复的数字。例如,要获得 500 个不同的六位数字,您可以使用:
selected = random.sample(xrange(100000, 1000000), 500)
可以自己动手,希望不要用尽它:
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
不过,当它筋疲力尽时,你会得到一个......
没有重复的随机序列不是随机的。
您可以通过增加可能值的范围来降低重复的可能性。
或者,您可以记录以前的返回值,如果以前返回过,则选择一个新值。
最后,您可以生成整个序列,然后对其进行随机播放。
当然,你需要弄清楚一旦你用尽了可能的返回值该怎么做,以及一旦只有少量可能的返回值时的行为是否真的是可取的。
此外,您应该遵守标准的 Python 编码标准。