是否可以窥视下一个兰特值

时间:2015-05-29 11:30:34

标签: c random

假设生成器已播种,可以在不更改的情况下查看下一个随机值?

即。给出:

#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数字时偷看吗?

4 个答案:

答案 0 :(得分:6)

对于大多数随机数生成器的当前实现,这是不可能的。但是有两种解决方案。

解决方案1 ​​

如果使用srand()函数将随机数生成器的起始值设置为相同的值,则始终会获得相同的数字序列。通过这种方式,您可以轻松预测第二遍中的数字。

解决方案2

简单地为数字写一个小缓冲区。

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个数字,偷看永远不会弄乱实际的生成器,这意味着它永远不会改变它的内部状态。