Вы уже сделали много правильных наблюдений!
Если вы не хотите засеять оба генератора случайных чисел, в конечном итоге, вероятно, будет проще выбрать один или другой генератор. Но если вам действительно нужно использовать оба, то да, вам также нужно будет засеять их оба, потому что они генерируют случайные числа независимо друг от друга.
Для numpy.random.seed()
, основная трудность заключается в том , что она не поточно- - то есть, это не безопасно использовать , если у вас есть много разных потоков исполнения , потому что это не гарантирует работу , если два разных потоков выполнения функции одновременно. Если вы не используете потоки и можете обоснованно ожидать, что вам не придется переписывать программу таким образом в будущем, все numpy.random.seed()
будет в порядке. Если есть какие-либо основания подозревать, что вам могут понадобиться потоки в будущем, в долгосрочной перспективе гораздо безопаснее сделать так, как предлагается, и создать локальный экземпляр numpy.random.Random
класса . Насколько я могу судить, random.random.seed()
он потокобезопасен (по крайней мере, я не нашел никаких доказательств обратного).
numpy.random
Библиотека содержит несколько распределений дополнительной вероятности , обычно используемых в научных исследованиях, а также несколько удобных функций для создания массивов случайных данных. random.random
Библиотека является немного более легкой, и должна быть хорошо , если вы не делаете научные исследования и другие виды работ в области статистики.
В противном случае они оба используют последовательность твистера Мерсенна для генерации своих случайных чисел, и оба они полностью детерминированы, то есть, если вы знаете несколько ключевых битов информации, можно с абсолютной уверенностью предсказать, какое число будет следующим . По этой причине ни numpy.random, ни random.random не подходят для каких-либо серьезных криптографических целей . Но поскольку последовательность очень-очень длинная, обе подходят для генерации случайных чисел в тех случаях, когда вы не беспокоитесь о людях, пытающихся реконструировать ваши данные. Это также причина необходимости засеять случайное значение - если вы начинаете каждый раз в одном и том же месте, вы всегда будете получать одну и ту же последовательность случайных чисел!
В качестве примечания: если вам действительно нужна случайность на уровне криптографии, вы должны использовать модуль секретов или что-то вроде Crypto.Random, если вы используете версию Python более раннюю, чем Python 3.6.
random.random
одиночку. Однако обычно вам это не нужно.