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

Axe*_*erg 11 python random random-access

我一直在寻找有关如何在python中生成随机数的类似问题.示例:类似问题 - 但我没有问题,随机函数每次都返回相同的值.

我的随机生成器工作正常,问题是它在调用函数时返回相同的值,我认为,同样的第二个是不可取的.

我的代码看起来像这样

def getRandomID():
    token = ''
    letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    for i in range(1,36):
        token = token + random.choice(letters)
    return token
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,当在不同时间调用时,此函数返回不同的值,但在同时调用函数时返回相同的值.我该如何避免这个问题?

我在后端服务器中使用此函数为前端用户生成唯一ID以插入数据库,因此在发生这种情况时我无法控制时间间隔.我必须有随机令牌来映射数据库中的用户,以便能够在数据库中使用queuenumbers正确插入它们.

Mar*_*ans 7

您可以通过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())
Run Code Online (Sandbox Code Playgroud)

这试图使用os.urandom()从操作系统提供的源生成随机数的函数.该.choices()函数还可用于在单个调用中返回选项列表,从而避免字符串连接:

import random

sys_random = random.SystemRandom()

def getRandomID():
    letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    return ''.join(sys_random.choices(letters, k=35))

print(getRandomID())
Run Code Online (Sandbox Code Playgroud)


Let*_*lle 5

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
Run Code Online (Sandbox Code Playgroud)

这个脚本在 1000 万个 ID 的第三次测试中再次使它们变得独一无二

将 for 循环更改为列表理解确实大大加快了速度。

>>> listt = getRandomID(10000000)
>>> print(len(listt))
10000000

>>> setOfIds = set(listt)
>>> print(len(setOfIds))
10000000
Run Code Online (Sandbox Code Playgroud)

此脚本使用重复排列:62 选择 35,理论上 id 的总数相当大 pow(62,35)

541638008296341754635824011376225346986572413939634062667808768
Run Code Online (Sandbox Code Playgroud)