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 次。
我无法预先计算和存储值
编辑:我在看这篇文章:
关于线性反馈移位寄存器的答案似乎是这样做的,但与其自己实现,我宁愿使用受信任的实现,因为这似乎是一个常见问题。
编辑:我想“跳”到第 n 项的原因是因为我在不同类别的不同种子中使用 rand,并且我一直在每个类别之间来回跳跃。我希望每个班级中的序列从停止的地方继续,而不是每次都从第一个数字开始。这是一个单线程应用程序。
编辑:在写这篇文章时,我使用了术语 PRNG。但实际上我只是在寻找一个似乎产生随机数的函数。我将它用于图形,因此没有安全问题。我使用随机数以像素为单位产生轻微的偏移。
编辑:犯了一个错误 - 存储状态是不够的。我需要在 O(1) 时间内连续计算第 n 个随机数。由于在同一个类中可能有多个调用相同的第 n 项,存储状态是不够的,我需要在 O(1) 中计算第 n 项
所有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)
after discard 5: 3684848379
0: 2357136044
1: 2546248239
2: 3071714933
3: 3626093760
4: 2588848963
5: 3684848379
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1783 次 |
| 最近记录: |