matlab: разные экземпляры начинаются с одного и того же случайного семени - PullRequest
0 голосов
/ 14 июля 2020

Используя MATLAB и пытаясь использовать компьютерный кластер, чтобы выполнить 100 повторений определенных вычислений с присущей c природой сточасти. Каждое из этих повторений должно включать один и тот же код, но с разными случайными начальными числами. Похоже, что

rng('shuffle')

, рекомендованное документацией , может не достичь этого, если все задания начинают выполняться одновременно (на разных машинах), поскольку используемое начальное число является целым числом, которое кажется инициализируется по времени (он монотонно увеличивается, кажется, что точность составляет сотую долю секунды.

Точность кажется разумной, но «коллизии» все еще очень вероятны при запуске 100-1000 экземпляров одновременно, что приводит к повреждению статистическая интерпретация результатов как независимая.

Любой способ избежать таких коллизий без ручного присвоения каждому экземпляру «идентификатора экземпляра», используемого в качестве начального значения?

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Что бы вы ни выбрали для начального числа, оно может принимать только 32-битное значение, даже если оно инициализирует генератор с большим состоянием, например Mersenne Twister ('twister', 19937 бит). Существуют определенные проблемы с 32-битными начальными числами, как обсуждалось в статье М. О'Нила " C ++ Seeding Surpting ". Предположительно, начальные числа, основанные на времени, также имеют длину 32 бита. Короткое начальное число означает, что может быть сгенерировано только ограниченное количество псевдослучайных последовательностей.

Похоже, что rng не поддерживает начальные числа длиннее 32 бит. С другой стороны, последние версии MATLAB поддерживают потоки случайных чисел , которые разработаны, среди прочего, если вам «нужны отдельные источники случайности в симуляции». Для ваших целей выберите генератор, который поддерживает несколько потоков, например mrg32k3a, и создайте потоки случайных чисел следующим образом (см. Также «Несколько потоков» ):

[stream1, stream2]=RandStream.create('mrg32k3a','NumStreams',2)
2 голосов
/ 14 июля 2020

Обычно я пытаюсь получить несколько серийных номеров с машины или жесткого диска, например

dos('wmic bios get serialnumber')

или

dos('wmic cpu')

ProcessorId, например, «BFEBFBFF000506E3» - еще один, который можно использовать и быть разными в вашем кластере. Таким образом, вероятно, многоядерные ядра используют NumberOfCores для разделения и, возможно, разных начальных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...