Вы уже сделали много правильных наблюдений!
Если вы не хотите засеять оба генератора случайных чисел, в конечном итоге, вероятно, будет проще выбрать один или другой генератор. Но если вам действительно нужно использовать оба, то да, вам также нужно будет засеять их оба, потому что они генерируют случайные числа независимо друг от друга.
Для 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
одиночку. Однако обычно вам это не нужно.Из Python для анализа данных модуль
numpy.random
дополняет Pythonrandom
функциями для эффективного создания целых массивов выборочных значений из многих видов распределений вероятностей.В отличие от этого, встроенный
random
модуль Python производит выборку только одного значения за раз, в то время какnumpy.random
может генерировать очень большие выборки быстрее. Используя волшебную функцию IPython,%timeit
можно увидеть, какой модуль работает быстрее:источник
np.random.randint(2)
сrandom.randrange(2)
NumPy и медленнее . NumPy: 1,25 мкс и Random: 891 нс. А также такое же соотношение дляnp.random.rand()
иrandom.random()
.Источник начального числа и используемый профиль распределения будут влиять на выходные данные - если вы ищете криптографическую случайность, при посеве из os.urandom () будут получены почти реальные случайные байты от болтовни устройства (например, Ethernet или диска) (т.е. dev / random на BSD)
это позволит избежать задания начального числа и генерации детерминированных случайных чисел. Однако случайные вызовы затем позволяют вам подогнать числа к распределению (то, что я называю научной случайностью - в конечном итоге все, что вам нужно, это распределение случайных чисел по кривой колокола, numpy лучше всего справляется с этим.
Итак, да, придерживайтесь одного генератора, но решайте, какой случайный вам нужен - случайный, но определенно из кривой распределения или настолько случайный, насколько вы можете получить без квантового устройства.
источник