#python #numpy
#python #numpy
Вопрос:
Чтобы получить детерминированный результат, я попытался использовать np.random.seed(0)
, но я заметил, что это работает не так, как я предполагал. Простой фрагмент для демонстрации этого выглядит следующим образом :
import numpy as np
np.random.seed(0)
error = np.random.rand(2,5)
print('error: n' ,error)
Приведенный выше фрагмент создает следующий вывод:
error:
[[ 0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[ 0.64589411 0.43758721 0.891773 0.96366276 0.38344152]]
Я могу запускать код столько раз, сколько захочу, и результат будет детерминированным, как и предполагалось. но когда я пытаюсь создать второй массив, это уже не тот случай!
Приведенный ниже фрагмент показывает это :
import numpy as np
np.random.seed(0)
error = np.random.rand(2,5)
error2 = np.random.rand(2,5)
print('error: n' ,error)
print('error2: n' ,error2)
Выводит :
error:
[[ 0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[ 0.64589411 0.43758721 0.891773 0.96366276 0.38344152]]
error:
[[ 0.79172504 0.52889492 0.56804456 0.92559664 0.07103606]
[ 0.0871293 0.0202184 0.83261985 0.77815675 0.87001215]]
Чего мне здесь не хватает? Я думал, что установка начального значения допускает детерминированное поведение, но, по-видимому, здесь это неприменимо! Что здесь происходит?
Комментарии:
1. Каждое созданное случайное число изменяет внутреннее состояние генератора случайных чисел (в противном случае он возвращал бы одно и то же число снова и снова). Вы должны сбросить его снова (установив начальное значение) после первого создания массива, чтобы снова получить те же данные.
Ответ №1:
Вам приходится каждый раз заново заполнять RNG.
import numpy as np
np.random.seed(0)
error = np.random.rand(2,5)
np.random.seed(0)
error2 = np.random.rand(2,5)
print('error: n' ,error)
print('error2: n' ,error2)
В противном случае вы просто продолжаете случайную последовательность, а не начинаете заново.
Ответ №2:
Если (псевдо) генератор случайных чисел (повторно) инициализирован с тем же начальным значением, он выдаст ту же последовательность чисел.
np.random.seed(0)
print (np.random.rand(),np.random.rand())
0.5488135039273248 0.7151893663724195
np.random.seed(0)
print (np.random.rand(),np.random.rand())
0.5488135039273248 0.7151893663724195
Это не будет генератор (псевдо) случайных чисел, если он генерирует одно и то же случайное число каждый раз для начального числа. Это будет некоторая детерминированная функция f(seed)
. При его заполнении последовательность чисел детерминирована, но сами числа случайны.