首页 > 解决方案 > 是否有一个随机数生成器可以在 O(1) 中跳过/丢弃 N 次抽奖?

问题描述

是否有任何(非加密)伪随机数生成器可以在 O(1) 中跳过/丢弃 N 个绘制,或者可能是 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;
}

非常感谢大家的帮助。我确实知道可能有证据表明这样的生成器不能同时存在并且是“伪随机”的。我非常感谢有关在哪里可以找到更多信息的任何提示。

标签: random

解决方案


当然。Linear Conguential Generator及其后代可以及时跳过N数字的生成O(log(N))。它基于 F.Brown 的论文,链接

是这个想法的实现,C++11。


推荐阅读