2015-09-21 30 views
8

我一直在寻找类似的问题,关于如何在python中生成随机数。例如:Similar Question - 但我没有问题,每次随机函数返回相同的值。random.choice()在同一秒内返回相同的值,如何避免它?

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

我的代码看起来像这样

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

正如我提到的这个函数返回时,被所谓的在不同的时间不同的值,但调用在同一时间的功能时返回相同的值。我如何避免这个问题?

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

+0

喜欢它当两个用户同时调用时返回相同的id? – Hackaholic

+9

我建议使用'uuid'来生成随机用户标识符。 – hjpotter92

+0

Hackaholic - 确切地说,它返回两个用户调用时相同的“token”,它是相同的randomletters字符串。 –

回答

4

你可能通过使用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()功能产生由操作系统提供来源的随机数。

+0

我认为这一见解就解决了这个问题。我会尝试进行更大规模的测试,在那里我可以确认解决方案的工作原理! –

1
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万个IDS第三测试再次取得了所有这些独特的

改变for循环列表理解并加速比不少。

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

>>> sofIds = set(listt) 
>>> print(len(sofIds)) 
10000000 

这个脚本使用排列有重:62选36, 到IDS的理论上的总数量是相当大的它是POW(62,36)

59720078628458064562952815512525677808980550940333281573339136 
+0

请考虑编辑您的帖子,以添加关于您的代码的功能以及为什么它可以解决问题的更多说明。一个主要包含代码的答案(即使它正在工作)通常不会帮助OP了解他们的问题。从我所看到的情况来看,这是多余的,因为这是Python通常用作种子基础的东西(我相信)。即使不是这样,这仍将提供相同的种子,同时产生相同的输出。 – SuperBiasedMan

+0

您不想在生成随机数的例程中调用'random.seed'。您将(偶尔非确定性地)在随后的调用中以'datetime.now'返回相同的值,这将导致'random.choice'返回相同的序列。 –

1

另一种办法是更新与先前的结果一起获得伪随机序列。选项将是old_seed异或结果或只是结果。

相关问题