【发布时间】:2019-06-26 08:06:33
【问题描述】:
是否有任何(非加密)伪随机数生成器可以在 O(1) 或 O(log N) 但小于 O(N) 时跳过/丢弃 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;
}
非常感谢大家的帮助。我确实知道可能有证据表明这样的生成器不能同时存在并且是“伪随机”的。我非常感谢有关在哪里可以找到更多信息的任何提示。
【问题讨论】:
-
明显的候选者是计数器模式下的任何对称密码。
-
@ChrisDodd:是的,跳过 O(1)。当然,生成相对昂贵,除非您将密码缩减到仅几轮。
-
感谢您的 cmets。
标签: random