是否有一个随机数生成器可以在 O(1) 中跳过/删除 N 次抽奖?

2023-12-03

是否有任何(非加密)伪随机数生成器可以在 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;
}

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


Sure. 线性同余发生器及其后代可以跳过一代N中的数字O(log(N))时间。基于F.Brown的论文,link.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有一个随机数生成器可以在 O(1) 中跳过/删除 N 次抽奖? 的相关文章

  • 在 Android 的 Recycler View 中的文本视图背景上生成并设置随机颜色

    I am Trying to Generate Random Colors and set the Random color as background of Text View Just Like in GMail app The Tex
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 为什么随机不那么随机?

    有人可以解释一下现代编程语言 java c python javascript 如何应对随机性的限制以及这些限制 例如基于时间的种子 的起源 即 如果它们是由底层操作系统和基于英特尔的硬件强加的 基本上我想了解为什么没有适当的硬件就没有真正
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 生成总和恒定的随机数

    我在想是否有办法生成一组随机数 其总和始终是一个常数 例如 20 可以分为 5 个数字 1 2 3 4 10 我不在乎这 5 个数字分别是什么 只要它们的总和等于 20 有没有办法以编程方式执行此操作 为了获得均匀分布 技巧是将总和视为一条
  • 打乱列表并返回副本

    我想对数组进行洗牌 但我找到的只是类似的方法random shuffle x from 在 Python 中随机化字符串列表的最佳方法 https stackoverflow com questions 1022141 best way t
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • mySQL 返回可能有重复项的随机行

    我正在尝试随机化一定数量的行 但假设数据库中只有 4 行 而我需要获得 6 个随机行 我希望有可能 即使表中有超过 6 行 产生重复的行行 这在 mySQL 中很容易实现吗 我当前的查询是这样的 SELECT FROM winners OR
  • 是否可以证明序列是否是随机的?

    考虑以下输入 1 1 2 3 5 8 这不是随机的 2 4 8 16 32 这都不是 4 1 2 11 5 9 这个看起来像随机序列 我想问是否有这样的算法来证明输入是否是随机的 不 没有这样的证明 如果你有完全随机的数字 则每个长度为 n
  • 固定长度的随机数

    我想生成一个 0 9 数字且长度 5 的随机整数 我尝试这样做 function genRand min max for var i 1 i lt 5 i var range max min 1 return Math floor Math
  • 在 C++ 中模拟 C# Random()(相同数字)

    有没有办法在 C 中实现 C Random 类 我特别需要根据给定的种子生成相同的数字序列 场景 我正在努力通过利用 C 中 Random 的使用来生成密钥 从而 破解 多个加密恶意软件 显然 这对于只有 2 32 个可能的密钥 约 4 3
  • 在Python中随机交错2个数组

    假设我有两个数组 a 1 2 3 4 b 5 6 7 8 9 我想将这两个数组交错为变量 c 注意 a 和 b 不一定具有相同的长度 但我不希望它们以确定性的方式交错 简而言之 仅仅压缩这两个数组是不够的 我不想要 c 1 5 2 6 3
  • PHP随机输出数组元素

    我如何从大约 20 个元素的数组中随机回显 5 个元素 Thanks 这有效吗 values array rand input 5 或者 作为更灵活的功能 function randomValues input num 5 return a
  • 在 R 中,如何让 PRNG 在平台之间给出相同的浮点数?

    在 R 4 1 1 中运行以下代码会在平台之间产生不同的结果 set seed 1 x lt rnorm 3 3 print x 22 0 83562861241004716 intel windows 0 8356286124100471
  • 如何生成泊松过程?

    原问题 我想生成一个泊松过程 如果按时间到达的人数t is N t 我有一个带有参数的泊松分布 我如何生成N t 我将如何在 C 中做到这一点 澄清 我最初想使用泊松分布生成过程 但是 我对我需要的过程参数感到困惑 我以为我可以用N t 但
  • 从文件夹中选择随机图像以显示在 picturebox、vb.net 中

    我有一个图片框 它从文件夹中读取图像进行显示 而不是通常的无聊图像 我认为在文件夹中包含许多图像并让我的 vb net 程序随机挑选一个来显示可能会更好使用 我怎样才能做到这一点 尝试这个 Public Function GetRandom
  • 在iOS中生成范围内的随机数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试让随机数生成器在 iPho
  • .php 随机图像在外部站点上作为 .jpg

    我发布的论坛只允许从外部 URL 加载 jpg png 和 gif 图像 我想解决这个问题 并从服务器上的目录中随机选择一个动态头像 但我无法使其正常工作 可能是由于在外部站点上执行了额外的检查 或者我的代码中存在错误 到目前为止 我已经在
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • rand() 的实现

    我正在用 C 编写一些嵌入式代码 需要使用 rand 函数 不幸的是 控制器的库不支持 rand 我需要一个快速的简单实现 但更重要的是空间开销很小 可以产生相对高质量的随机数 有谁知道使用哪种算法或示例代码 编辑 它用于图像处理 因此 相

随机推荐