Заполнение энтропии и параллельного генератора случайных чисел

У меня есть цикл, в котором я добавляю шум в некоторые точки; позже они используются в качестве основы для некоторых статистических тестов.

Используемые наборы данных довольно большие, поэтому я хотел бы распараллелить их с помощью openMP, чтобы ускорить процесс. Проблема возникает, когда я хочу иметь несколько ГПСЧ. У меня есть собственный класс PRNG, основанный на методе NR по модулю (я думаю, rand4), но я не уверен, как правильно засеять PRNG, чтобы обеспечить соответствующую энтропию

Normalliy, я бы сделал что-то вроде этого

prng.initTimer();

Но если у меня есть массив из prngs, по одному на рабочий поток, то я не могу просто вызвать initTimer для каждого экземпляра - таймер может не измениться, а близкие таймеры могут вызвать корреляцию.

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

Я думал просто использовать

prng[0].initTimer()
for(int i=1; i<numRNGs; i++)
     prng[i].init(prng[0].getRandNum());

Затем вызвать мой цикл, но не уверен, внесет ли это корреляцию в метод по модулю.

6
задан CppUser123 23 April 2011 в 15:51
поделиться