У меня n
аналогично анализу каждый из которых используют m_i
числа потоков псевдослучайных (m_i
может варьироваться от анализа). Каждый анализ имеет свое собственное начальное число случайных чисел, так что случайные числа не связаны между анализами.
Моя проблема в том, что мне нужно создать потоки m_i
из одного семени. Анализ в настоящее время написан на Numpy, так что решения его Mersenne Twister идеальны, но я открыт для решений в других зрелых библиотеках. Я рассмотрел эти возможности:
Используйте начальное число для создания потока случайных чисел, нарисуйте целые числа m_i
и используйте эти целые числа в качестве начальных чисел для случайных потоков m_i
. Это не хорошо из-за парадокса дня рождения. Есть 2 ^ 32 (~ 4 миллиарда) семян, но если бы я столкнулся с коллизиям (два потока начались с одного и того же семени) после 2 ^ 16 (~ 60000).
Умножьте начальное число на некоторую константу m_max
для каждого индекса потока на 1, чтобы получить начальное значение этого потока. (например, с seed=2
и m_max=10000
, анализ будет использовать seed 20001, 20002, 20003 и т.д.). Это нежелательно, поскольку все анализы будут ограничены потоками m_max
до того, как возникнут коллизии, а если m_max
слишком велико, количество анализов будет ограничено 2^32/m_max
.
Используйте начальное число для создания потока случайных чисел, нарисуйте 624 32-разрядных целых числа на каждый необходимый поток и установите состояние каждого потока равным 624 целым числам, нарисованным для него. Это кажется идеальным, за исключением того, что я понятия не имею, является ли 624 случайных целых числа действительным внутренним состоянием для Twister Мерсенна (это могут быть произвольные биты?). Я также не знаю, есть ли какая-то скрытая корреляция между целыми числами (возможно, это один и тот же поток, только смещенный на 624).
Есть ли стандартный способ сделать это?
Подход 3 может работать, так как начальное число для любого PRNG может быть таким же длинным, как и это состояние PRNG (например, Mersenne Twister имеет длину состояния 19968 битов или 624 * 32 битов, поэтому может принимать начальное число до такого количества битов - он не ограничен 32 или 64 битами, как это практикуется со многими API, которые реализуют Mersenne Twister). Однако вы должны использовать PRNG несвязанного дизайна с Mersenne Twister, такой как PCG, посеять этот PRNG, а затем нарисовать 624-целое семя, как вы предлагаете. (Или, если вам не требуются воспроизводимые результаты или если вы сохраните 624-целочисленные secrets.SystemRandom
числа, сгенерированные таким образом, вы можете использовать криптографический ГСЧ, такой как os.urandom()
или secrets.SystemRandom
, чтобы нарисовать эти secrets.SystemRandom
. ) Моя статья о RNG предлагает несколько PRNG с различным дизайном.