Я хочу чтобы убедиться, что все симуляции статистически независимы и что рисуемые случайные числа не перекрываются.
Я использую OpenMP для распараллеливания циклов for, поэтому скелетный код выглядит следующим образом: это:
Код: Выделить всё
vector data(number_of_sims);
double t;
double r;
#pragma omp parallel for
for(int i = 0; i < number_of_sims; i++){
// run sim
t = 0;
while (t < T) {
r = draw_random_uniform();
if (r < p) do_something();
else do_something_else();
t += 1.0; // increment time
}
// some calculation
data[i] = calculate();
}
Код: Выделить всё
double draw_random_uniform(){
static thread_local auto seed = std::random_device{}();
static thread_local mt19937 mt(seed);
std::uniform_real_distribution distribution(0.0, 1.0);
double r = distribution(mt);
return r;
}
Поэтому вместо этого я хочу создать начальный генератор случайных чисел, а затем переместить его вперед на большую величину для каждого из потоков. Я пытался сделать это с помощью PRNG Xoroshiro256+ (здесь я нашел хорошую реализацию: https://github.com/Reputeless/Xoshiro-cpp). Например, что-то вроде этого:
Код: Выделить всё
XoshiroCpp::Xoshiro256Plus prng(42); // properly seeded prng
#pragma omp parallel num_threads()
{
static thread_local XoshiroCpp::Xoshiro256Plus lprng(prng); // thread local copy
lprng.longJump(); // jump ahead
// code as before, except use lprng to generate random numbers
# pragma omp for
....
}
Я Я не уверен, что это лучший способ сделать все это. Любые советы приветствуются.
Подробнее здесь: https://stackoverflow.com/questions/752 ... prngs-in-c
Мобильная версия