我一直在研究关于如何在python中生成随机数的类似问题。示例:类似的问题-但我没有randomfunction每次返回相同值的问题。
我的随机生成器工作得很好,问题是它在我认为的同一秒调用函数时返回相同的值,这是不可取的。
我的代码看起来像这个
def getRandomID():
token = ''
letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
for i in range(1,36):
token = token + random.choice(letters)
return token
正如我提到的,这个函数在不同的时间被调用时返回不同的值,但在同一时间调用该函数时返回相同的值。如何避免这个问题?
我在后端服务器中使用此函数为前端用户生成唯一的ID,以便插入数据库,因此我无法控制发生这种情况时的时间间隔。我必须有随机令牌来映射数据库中的用户,以便能够在数据库中正确插入带有队列号的用户。
您可以通过使用random.SystemRandom()
来改善问题,如下所示:
import random
sys_random = random.SystemRandom()
def getRandomID():
token = ''
letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
for i in range(1, 36):
token = token + sys_random.choice(letters)
return token
print(getRandomID())
这尝试使用os.urandom()
函数,该函数从操作系统提供的源生成随机数。.choices()
函数也可以用于在单个调用中返回一个选择列表,避免字符串串接:
import random
sys_random = random.SystemRandom()
def getRandomID():
letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
return ''.join(sys_random.choices(letters, k=35))
print(getRandomID())
def getRandomID(n):
import datetime
import random
random.seed(datetime.datetime.now())
letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
idList = [ ''.join([random.choice(letters) for j in range(1,36)]) for i in range(n)]
return idList
这个脚本在第三次测试1000万个id时再次使它们变得独一无二
将循环改为列表理解确实加快了速度。
>>> listt = getRandomID(10000000)
>>> print(len(listt))
10000000
>>> setOfIds = set(listt)
>>> print(len(setOfIds))
10000000
这个脚本使用具有重复的排列:62选择35,从理论上讲,id的总数相当大,它是pow(62,35(
541638008296341754635824011376225346986572413939634062667808768
另一个选项是用以前的结果更新种子以获得伪随机序列。一个选项是old_seed XOR结果,或者只是结果。