是否有一个随机数生成器可以跳过O(1)中的N个抽签?

时间:2019-01-30 16:59:04

标签: random

是否有(非加密的)伪随机数生成器可以跳过/丢弃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;
}

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

3 个答案:

答案 0 :(得分:2)

好的。 Linear Conguential Generator及其后代可以在N的时间内跳过生成O(log(N))个数字。它基于F.Brown link的论文。

Here是该概念C ++ 11的实现。

答案 1 :(得分:2)

如Severin Pappadeux所指出的,PCG variant developed by M.E. O'NeillCC++Haskell实现为此类 ajumping 提供了接口> / 后退功能:herein

函数名称为:advancebackstep,分别简要记录为hereathereat

从网页上引用(在撰写本文时可以访问):

  

...随机数生成器就像一本书,逐页列出统计随机数。种子为我们提供了一个起点,但有时能够按顺序前进或后退,并且能够高效地进行操作,这很有用。

     

PCG生成方案的C ++实现为有效地向前跳转提供了前进,而向后方则有效地向后跳转。

答案 2 :(得分:0)

克里斯·多德(Chris Dodd)写道:

  

显而易见的候选者将是处于计数器模式的任何对称密码。