假设生成器已播种,可以在不更改的情况下查看下一个随机值?
即。给出:
#include <stdlib.h>
int r;
r = rand(); // say this is 99
r = rand(); // say this is 80
这可能吗
#include <stdlib.h>
int r;
r = peekAtRand(); // this will give 99
r = rand(); // but this still gives 99
r = peekAtRand(); // this will give 80
r = rand(); // but this still gives 80
此外,这可以延伸到下一个 n数字时偷看吗?
答案 0 :(得分:6)
对于大多数随机数生成器的当前实现,这是不可能的。但是有两种解决方案。
如果使用srand()
函数将随机数生成器的起始值设置为相同的值,则始终会获得相同的数字序列。通过这种方式,您可以轻松预测第二遍中的数字。
简单地为数字写一个小缓冲区。
const int randBufferSize = 1024;
int randBuffer[randBufferSize];
int randBufferPosition = 0;
// Initialise the buffer with random data.
void initRandBuffer() {
for (int i = 0; i < randBufferSize; ++i) {
randBuffer[i] = rand();
}
}
// Peek at the n'th random number (starting from 0).
int peekAtRand(int n) {
int peekIndex = randBufferPosition + n;
if (peekIndex >= randBufferSize) {
peekIndex -= randBufferSize;
}
return randBuffer[peekIndex];
}
// Get the next random number.
int getRand() {
int result = randBuffer[randBufferPosition];
randBuffer[randBufferPosition] = rand();
++randBufferPosition;
if (randBufferPosition >= randBufferPosition) {
randBufferPosition = 0;
}
}
答案 1 :(得分:4)
int peek;
int r;
peek = rand();
doPeekyThings(peek);
r = peek;
答案 2 :(得分:2)
您可以按如下方式实施peekAtRand
:
int peekAtRand()
{
int r,s;
s = rand();
srand(s);
r = rand();
srand(s);
return r;
}
要使其值得&#34;值得&#34;,请在程序开头调用srand((unsigned int)time(NULL))
。
答案 3 :(得分:2)
假设生成器已播种,可以在不更改的情况下查看下一个随机值?
不单独使用rand()
。你需要缓冲它。
此外,这可以延伸到下一个n号码偷看吗?
如果缓冲它,那么是:
const int bufsize = 15;
int randarr[bufsize];
int cur_rand = 0;
int my_srand(int seed) {
srand(seed);
for (int i=0;i<bufsize;++i) {
randarr[i] = rand();
}
}
int my_rand() {
int r = randarr[cur_rand];
randarr[cur_rand] = rand();
++cur_rand;
if (cur_rand >= bufsize) cur_rand = 0;
return r;
}
int peek_my_rand(int n = 0) {
return randarr[(cur_rand + n)%bufsize];
}
通过这个实现,你总是可以查看bufsize
个数字,偷看永远不会弄乱实际的生成器,这意味着它永远不会改变它的内部状态。