我只是很好奇,单线程程序能否连续两次调用rand()获得相同的返回值?

那么,这种说法会不会奏效?

assert(rand() != rand());

最佳答案

如果我们能找到一个可行的例子,那么您的问题的答案是"is"。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  unsigned int i;
  for(i = 0; ; i++) {
    int r = rand();
    if (r == rand()) {
        printf("Oops. rand() = %d; i = %d\n", r, i);
        break;
    }
  }
  return 0;
}

在装有Visual Studio 2010的Windows上打印Oops. rand() = 3482; i = 32187

编辑:
使用下面的版本来检测所有连续2个rand()调用返回相同值的序列。
C仅指定rand()应该返回“伪随机整数,范围为0到
RAND_MAX”和RAND_MAX应该至少为32767。
PRNG的质量,其实现方式或其他细节(例如,两个连续的rand()调用是否可以返回相同的值)都没有限制。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  unsigned int i;
  int r1 = rand();
  int r2 = rand();
  for(i = 0; ; i++) {
    if (r1 == r2) {
        printf("Oops. rand() = %d; i = %d\n", r1, i);
    }
    r1 = r2;
    r2 = rand();
  }
  return 0;
}

10-04 22:06
查看更多