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