2015-09-21 1 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 

Как я уже говорил эта функция возвращает разные значения при их называют в в разное время, но возвращает то же значение при вызове функции одновременно. Как избежать этой проблемы?

Я использую эту функцию во внутреннем сервере для генерации уникальных идентификаторов для пользователей в интерфейсе для вставки в базу данных, поэтому я не могу контролировать временные интервалы, когда это происходит. У меня должны быть случайные токены для сопоставления пользователей в базе данных, чтобы они могли правильно вставлять их с помощью queuenumbers в базе данных.

+0

как он возвращает тот же идентификатор, когда вызывается двумя пользователями одновременно? – Hackaholic

+9

Я бы предложил использовать 'uuid' для генерации случайных идентификаторов пользователей. – hjpotter92

+0

Hackaholic - точно, он возвращает тот же «токен», который является той же цепочкой случайных чисел при вызове двумя пользователями. –

ответ

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 

этот сценарий в 3-м испытания 10 миллионов ид снова сделал их уникальный

меняется цикл к списку понимания сделал ускорив совсем немного.

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

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

этот скрипт использует перестановки с повторением: 62 выбирают 36, теоретически общее количество идентификаторов достаточно большой это пау (62,36)

59720078628458064562952815512525677808980550940333281573339136 
+0

Пожалуйста, подумайте над редактированием сообщения, чтобы добавить больше объяснений о том, что делает ваш код и почему он решит проблему. Ответ, который в основном содержит только код (даже если он работает), обычно не помогает OP понять их проблему. Из того, что я вижу, это избыточно, хотя, как я полагаю, Python обычно использует в качестве основы для своего семени. И даже если это не так, это все равно будет обеспечивать одно и то же семя в то же время, что приведет к тому же результату. – SuperBiasedMan

+0

Вы не хотите вызывать 'random.seed' из процедуры, которая генерирует случайные числа. Вы будете (иногда, недетерминистски) в конечном итоге с тем же значением, возвращающимся с 'datetime.now' на последующие вызовы, что приведет к тому, что' random.choice' вернет идентичные последовательности. –

1

Другим вариантом было бы, чтобы обновить семя с предыдущим результатом, чтобы получить псевдослучайную последовательность. Параметром будет результат old_seed XOR или только результат.

Смежные вопросы