Так что на самом деле это сложнее, чем ожидалось. Есть два вопроса:
Во-первых, допустим, у вас есть 40 mpi-процессов, которым нужно нарисовать 10 чисел, используя равномерное распределение между 0 и 1. Затем, если вы возьмете 400 чисел, используя одну цепочку, вы получите довольно хорошее равномерное распределение. , Но если вы нарисуете только 10 число, вы, вероятно, не будете. Рисунок 10 числа из 40 цепочек не является строго эквивалентным рисунку 400 числа из одной цепочки. Но эта проблема появится, только если вам нужен хороший контроль над вашим дистрибутивом.
Во-вторых, допустим, вы хотите изучить данную проблему численно. То, что вы должны проверить, - это сходимость вашего решателя. Для этого вам нужно посмотреть, хорошо ли работает ваш решатель при уточнении разрешения. Так что вам нужно генерировать различные реализации (ваши случайные числа) таким образом, чтобы вы сохраняли одни и те же низкие частоты (если вы думаете в пространстве Фурье). Для этого вы должны быть уверены, что случайное число, которое находится в данном месте (скажем, 327 из ваших 400), всегда одинаково, независимо от количества процессов, которые вы используете.
Обе эти проблемы показывают, что простое получение последовательного номера из цепочки не является хорошим решением.
Итак, что вы можете сделать, это:
-использовать одну цепь
- 1-й процесс использует первые 10 номеров цепочки.
- 2-й процесс использует 11-20-й номер цепочки.
......
Но это означает, что данный процесс должен отказаться от заданного количества элементов в цепочке. Если вы используете «обычный» генератор случайных чисел, отбрасывание n чисел является операцией O (n). Это означает, что вы не можете распараллелить вашу проблему. Что вам нужно, так это использовать генератор случайных чисел, который содержит метод для отбрасывания n draw в O (1). Существует множество таких методов, которые вы можете найти в Интернете. Или вы можете написать его самостоятельно (но это действительно попытка изобретать велосипед).
Сам использую:
https://rdrr.io/cran/sitmo/
Но это для C ++, но вы наверняка сможете найти версию для C или откомпилировать только эту часть с C ++ ...