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正确插入它们.
您可以通过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)
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)