随机选择()在同一秒返回相同的值,如何避免它



我一直在研究关于如何在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结果,或者只是结果。

最新更新