Генерировать случайное семя в Python

Есть ли способ генерировать случайное семя? что-то вроде этого:

def random_seed(length)

пример вывода:

3273650411015667511766

или есть способ сделать и цифры и буквы? пример вывода:

ryf65s4d4s6df54s6y4fs6f5b4y6s4fy

person user9430938    schedule 19.10.2019    source источник
comment
Возможный дубликат случайного хеша в Python   -  person Pedro Rodrigues    schedule 20.10.2019
comment
Что вы имеете в виду под семенем? Похоже, что вы хотите спросить, это не то, что вы спрашиваете.   -  person zvone    schedule 20.10.2019
comment
@PedroRodrigues, хотя вопрос плохо сформулирован, насколько я понимаю, он хотел как случайные целые числа, так и строки, поэтому на самом деле это не дубликат этого вопроса.   -  person RMPR    schedule 20.10.2019
comment
@RMPR в ответах на этот вопрос есть масса разных хэшей. Этот, например, очень похож на ожидаемый результат, который запросил OP. Я думаю, вы имели в виду случайные ints и strings в выводе. Я что-то упускаю?   -  person Pedro Rodrigues    schedule 20.10.2019
comment
Если вы посмотрите мой ответ, я написал два метода: первый только для случайных int, а второй для случайных int и string, и из-за первого я думаю, что эти два вопроса не совпадают.   -  person RMPR    schedule 20.10.2019
comment
OP, если вы не знаете, начальное число обычно относится к вводу RNG. Для некоторых реализаций ГСЧ можно извлечь начальное число из существующего ГСЧ. ГСЧ по умолчанию в Python — это твистер Мерсенна, который имеет некоторые неудобные проблемы, если вы попытаетесь использовать семя размером с человека. Другие генераторы случайных чисел, такие как PCG, во многих отношениях лучше (если вы не занимаетесь криптографией).   -  person o11c    schedule 20.10.2019


Ответы (3)


Вы можете использовать os.urandom. Это позволяет вам указать количество случайных байтов, которые вы хотите сгенерировать. Конечно, вы можете конвертировать/интерпретировать эти байты как угодно (целые числа, символы,...). Например:

>>> import os
>>> os.urandom(16)
b'-\xca(\xd2\xf7 \xe3:\x8fj\x19#\xe0-\xb8X'

os.urandom будет использовать источник случайности ОС (например, значения датчиков и т. д.). Если вы вызываете random.seed() без аргументов, он также будет отступать в ОС. случайность, если она доступна, иначе текущее системное время.

Возможные способы интерпретации байтов:

>>> int.from_bytes(os.urandom(16), 'big')
305697826269747251034239012950993064203
person a_guest    schedule 19.10.2019
comment
Требуется дополнительная обработка или я что-то упускаю? - person RMPR; 20.10.2019
comment
@RMPR Конечно, пользователь сам решает, как интерпретировать эти байты (как числа, символы и т. д.). - person a_guest; 20.10.2019

это, кажется, работает;

import random
length=random.randint(1,30)
chars=[char for char in '0123456789abcdefghijklmnopqrstuvwxyz']
print(chars)
seed=''
for i in range(length): seed=seed+random.choice(chars)
print(seed)
person 3NiGMa    schedule 19.10.2019

Для целых чисел:

import random 

def random_seed(length):
    random.seed()
    min = 10**(length-1)
    max = 9*min + (min-1)
    return random.randint(min, max)

Для строк наивный подход может быть:

import random

choices = '0123456789abcdefghijklmnopqrstuvwxyz'

def random_char(pos):
   return random.choice(choices)

def random_seed(length):
  l = [None]*length
  random.seed()
  return "".join(list(map(random_char, l)))

Осторожно, это не должно использоваться в целях безопасности, вместо этого вы должны полагаться на os.urandom.

person RMPR    schedule 19.10.2019