如何直接获得 rand() 序列中的第 n 个数字而不必调用 rand() n 次?

Pte*_*tyl 7 c c++ random objective-c srand

根据我的理解,使用特定种子设置 srand 会导致对 rand() 的调用序列每次为该特定种子生成相同的数字序列:

例如:

             srand(seed1);
             rand() // firstnumber (e.g.: 42)
             rand() // second number (e.g: 17)
             srand(seed1)
             rand() // first number (same as above (42))
             rand() // second number (same as above (17))
Run Code Online (Sandbox Code Playgroud)

有没有办法直接获得序列中的第 n 个数字而不必调用 rand() n 次?

  • 例如,如果我想要系列中的第 17 个随机数,我想在一次调用中获取该数字,而不是调用 rand() 17 次。

  • 我无法预先计算和存储值

编辑:我在看这篇文章:

https://mathoverflow.net/questions/104915/pseudo-random-algorithm-allowing-o1-computation-of-nth-element

关于线性反馈移位寄存器的答案似乎是这样做的,但与其自己实现,我宁愿使用受信任的实现,因为这似乎是一个常见问题。

编辑:我想“跳”到第 n 项的原因是因为我在不同类别的不同种子中使用 rand,并且我一直在每个类别之间来回跳跃。我希望每个班级中的序列从停止的地方继续,而不是每次都从第一个数字开始。这是一个单线程应用程序。

编辑:在写这篇文章时,我使用了术语 PRNG。但实际上我只是在寻找一个似乎产生随机数的函数。我将它用于图形,因此没有安全问题。我使用随机数以像素为单位产生轻微的偏移。

  • 我只需要一个快速的功能。
  • 似乎产生随机数,但不一定是安全应用程序中使用的那种。
  • 必须能够在 O(1) 时间内计算出第 n 个数字。

编辑:犯了一个错误 - 存储状态是不够的。我需要在 O(1) 时间内连续计算第 n 个随机数。由于在同一个类中可能有多个调用相同的第 n 项,存储状态是不够的,我需要在 O(1) 中计算第 n 项

kfs*_*one 5

所有C++11 PRNG都有一个“ discard ”函数,例如

#include <random>
#include <iostream>

int main() {
    std::mt19937 rng;
    static const size_t distance = 5;

    rng.seed(0);
    rng.discard(distance);
    std::cout << "after discard 5: " << rng() << '\n';

    rng.seed(0);
    for (size_t i = 0; i <= distance; ++i) {
        std::cout << i << ": " << rng() << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/0zeRNq

after discard 5: 3684848379
0: 2357136044
1: 2546248239
2: 3071714933
3: 3626093760
4: 2588848963
5: 3684848379
Run Code Online (Sandbox Code Playgroud)