Реализация схемы генерации PCG в C ++ позволяет эффективно переходить вперед и назад, чтобы эффективно переходить назад.
твует ли какой-либо (не криптографический) генератор псевдослучайных чисел, который может пропускать / отбрасывать N отрисовок в O (1) или, возможно, O (log N), но меньше, чем O (N).
Особенно для параллельных применений было бы полезно иметь генератор вышеуказанного типа. Изображение, которое вы хотите создать массив случайных чисел. Можно написать параллельную программу для этой задачи и запустить генератор случайных чисел для каждого потока независимо. Однако числа в массиве не будут такими же, как для последовательного случая (за исключением, возможно, первой половины).
Если бы существовал генератор случайных чисел вышеуказанного типа, первый поток мог бы начинаться с начального числа, используемого для последовательной реализации. Второй поток также может начинать с этого начального числа, а затем отбрасывать / пропускать N / 2 выборок, которые генерируются первым потоком. Выходной массив будет тогда идентичен последовательному случаю (простое тестирование), но все равно будет сгенерирован за меньшее время. Ниже приведен псевдокод.
#define _POSIX_C_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
void rand_r_skip(unsigned int *p_seed, int N)
{
/* Stupid O(N) Implementation */
for (int i = 0; i < N; i++)
{
rand_r(p_seed);
}
}
int main()
{
int N = 1000000;
unsigned int seed = 1234;
int *arr = (int *)malloc(sizeof(int) * N);
#pragma omp parallel firstprivate(N, seed, arr) num_threads(2)
{
if (omp_get_thread_num() == 1)
{
// skip the samples, obviously doesn't exist
rand_r_skip(&seed, N / 2);
}
#pragma omp for schedule(static)
for (int i = 0; i < N; i++)
{
arr[i] = rand_r(&seed);
}
}
return 0;
}
Спасибо всем большое за вашу помощь. Я знаю, что может быть доказательство того, что такой генератор не может существовать и быть «псевдослучайным» одновременно. Я очень благодарен за любые подсказки о том, где можно найти дополнительную информацию.