Реализация схемы генерации 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;
}

Спасибо всем большое за вашу помощь. Я знаю, что может быть доказательство того, что такой генератор не может существовать и быть «псевдослучайным» одновременно. Я очень благодарен за любые подсказки о том, где можно найти дополнительную информацию.

Ответы на вопрос(2)

Ваш ответ на вопрос