是否有(非加密的)伪随机数生成器可以跳过/丢弃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;
}
非常感谢大家的帮助。我确实知道,可能有证据证明这样的生成器不能存在,并且同时是“伪随机”的。非常感谢您在哪里可以找到更多信息的提示。
答案 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'Neill的C
,C++
和Haskell
实现为此类 ajumping 提供了接口> / 后退功能:herein。
函数名称为:advance
和backstep
,分别简要记录为hereat和hereat
从网页上引用(在撰写本文时可以访问):
...随机数生成器就像一本书,逐页列出统计随机数。种子为我们提供了一个起点,但有时能够按顺序前进或后退,并且能够高效地进行操作,这很有用。
PCG生成方案的C ++实现为有效地向前跳转提供了前进,而向后方则有效地向后跳转。
答案 2 :(得分:0)
克里斯·多德(Chris Dodd)写道:
显而易见的候选者将是处于计数器模式的任何对称密码。