代码之家  ›  专栏  ›  技术社区  ›  Herpes Free Engineer

如何生成“未来指数”伪随机数而不生成其前一个数[重复]

  •  3
  • Herpes Free Engineer  · 技术社区  · 6 年前


    #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 回复  |  直到 6 年前
        1
  •  2
  •   Severin Pappadeux    6 年前

    Linear Conguential Generator N 数字输入 O(log(N)) 时间。它是以F.布朗的论文为基础, link .

    Here

        2
  •  2
  •   Community CDub    4 年前

    如Severin Pappadeux所示 C C++ Haskell a的实现 PCG variant developed by M.E. O'Neill 提供这样的接口 向前跳 向后跳 功能: herein .

    advance backstep ,它们被简要地记录下来 hereat hereat 分别是

    引用网页(在撰写本文时访问):

    ... 随机数生成器就像一本书,一页接一页地列出统计上的随机数。种子给了我们一个起点,但有时能够在序列中向前或向后移动是有用的,并且能够有效地这样做。

    PCG生成方案的C++实现提供了有效地跳转和后退以有效地向后跳转的提前。

        3
  •  0
  •   Peter O.    5 年前

    明显的候选方案是任何计数器模式下的对称密码。