Несколько независимых потоков случайных чисел из одного семени

1

У меня n аналогично анализу каждый из которых используют m_i числа потоков псевдослучайных (m_i может варьироваться от анализа). Каждый анализ имеет свое собственное начальное число случайных чисел, так что случайные числа не связаны между анализами.

Моя проблема в том, что мне нужно создать потоки m_i из одного семени. Анализ в настоящее время написан на Numpy, так что решения его Mersenne Twister идеальны, но я открыт для решений в других зрелых библиотеках. Я рассмотрел эти возможности:

  1. Используйте начальное число для создания потока случайных чисел, нарисуйте целые числа m_i и используйте эти целые числа в качестве начальных чисел для случайных потоков m_i. Это не хорошо из-за парадокса дня рождения. Есть 2 ^ 32 (~ 4 миллиарда) семян, но если бы я столкнулся с коллизиям (два потока начались с одного и того же семени) после 2 ^ 16 (~ 60000).

  2. Умножьте начальное число на некоторую константу m_max для каждого индекса потока на 1, чтобы получить начальное значение этого потока. (например, с seed=2 и m_max=10000, анализ будет использовать seed 20001, 20002, 20003 и т.д.). Это нежелательно, поскольку все анализы будут ограничены потоками m_max до того, как возникнут коллизии, а если m_max слишком велико, количество анализов будет ограничено 2^32/m_max.

  3. Используйте начальное число для создания потока случайных чисел, нарисуйте 624 32-разрядных целых числа на каждый необходимый поток и установите состояние каждого потока равным 624 целым числам, нарисованным для него. Это кажется идеальным, за исключением того, что я понятия не имею, является ли 624 случайных целых числа действительным внутренним состоянием для Twister Мерсенна (это могут быть произвольные биты?). Я также не знаю, есть ли какая-то скрытая корреляция между целыми числами (возможно, это один и тот же поток, только смещенный на 624).

Есть ли стандартный способ сделать это?

Теги:
numpy
random
random-seed

1 ответ

1

Подход 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 с различным дизайном.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню