random.choice()在同一秒返回相同的值,如何避免它呢?


问题内容

我一直在寻找有关如何在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())