Python Numpy: случайное число в цикле - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть такой код и я использую Jupyter-Notebook

for j in range(timesteps):    
    a_int = np.random.randint(largest_number/2) # int version

, и я получаю случайные числа, но когда я пытаюсь переместить часть кода в функции, я начинаю получать одно и то же число в каждой итерации

def create_train_data():        
    np.random.seed(seed=int(time.time()))     
    a_int = np.random.randint(largest_number/2) # int version
    return a

for j in range(timesteps):    
    c = create_train_data()  

Почему это произошло и как это исправить?я думаю, может быть, это из-за процессов в Jupyter-Notebook

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Другие ответы верны, когда говорят, что это из-за семени.Если вы посмотрите документацию от SciPy , вы увидите, что семена используются для создания предсказуемой случайной последовательности.Тем не менее, я думаю, что следующий ответ на другой вопрос о семенах дает лучший обзор того, что он делает и почему / где его использовать. Что делает numpy.random.seed (0)?

0 голосов
/ 18 сентября 2018

Ганс Масгрейв ответит отлично, если вы довольны псевдослучайными числами.Псевдослучайные числа хороши для большинства приложений, но они проблематичны, если используются для криптографии.

Стандартный подход для получения одного действительно случайного числа - это заполнение генератора случайных чисел системным временем перед тем, как вывести число, как вы.пытался.Однако, как указал Ханс Масгрейв, если вы приведете время к int, вы получите время в секундах, которое, скорее всего, будет одинаковым на протяжении всего цикла.Правильное решение для заполнения RNG временем:

def create_train_data():        
    np.random.seed()     
    a_int = np.random.randint(largest_number/2) # int version
    return a

Это работает, потому что Numpy уже использует часы компьютера или другой источник случайности для начального числа, если вы не передаете аргументы (или None) дляnp.random.seed:

Параметры: seed: {None, int, array_like}, необязательное начальное число, используемое для инициализации генератора псевдослучайных чисел.Может быть любым целым числом от 0 до 2**32 - 1 включительно, массивом (или другой последовательностью) таких целых чисел или None (по умолчанию).Если seed равно None, то RandomState попытается прочитать данные из /dev/urandom (или аналога Windows), если они доступны, или начать с часов в противном случае.

Все зависит от вашего приложенияхоть.Обратите внимание на предупреждение в документах:

Предупреждение Псевдослучайные генераторы этого модуля не должны использоваться в целях безопасности.В целях безопасности или криптографического использования см. Модуль секретов.

0 голосов
/ 18 сентября 2018

Неправильная строка кода:

np.random.seed(seed=int(time.time()))

Поскольку вы выполняете цикл, который завершается довольно быстро, вызов int() в это время уменьшает случайное начальное число до того же числа для всего цикла,Если вы действительно хотите вручную установить начальное число, следующий подход является более надежным.

def create_train_data():   
    a_int = np.random.randint(largest_number/2) # int version
    return a

np.random.seed(seed=int(time.time()))
for j in range(timesteps):
    c = create_train_data()

Обратите внимание, как начальное число создается один раз, а затем используется для всего цикла, так что каждый раз случайное целое числоназывается начальным изменением без сброса.

Обратите внимание, что numpy уже заботится о псевдослучайном начальном числе.Вы не получите больше случайных результатов, используя его.Распространенной причиной для ручной настройки семян является обеспечение воспроизводимости.Вы устанавливаете начальное число в начале вашей программы (верхняя часть вашей записной книжки) на некоторое фиксированное целое число (я вижу 42 во многих руководствах), и затем все вычисления следуют из этого начального числа.Если кто-то хочет проверить ваши результаты, стохастичность алгоритмов не может быть мешающим фактором.

...