C ++更深入地了解rand()和srand()

时间:2019-09-14 08:33:26

标签: c++ random random-seed

我知道rand()srand()的相互关系,我知道如何使用它们,但是它们的工作机制对我来说真的很有趣,我想知道他们是如何工作的?!,但是我找不到任何特别的东西。

这是我的问题:rand()srand()的内部发生了什么,它如何产生一个随机数? (如果确实是产生一个随机数!)它是否具有任何特殊的数学计算或特殊的算法?是什么?

1 个答案:

答案 0 :(得分:4)

首先,rand() 不会产生随机数字。这是Pseudo Random Number Generator

rand()通常 实施为linear congruential generator。 您可以认为存在一个变量seed,该变量保存了生成器的先前状态,然后rand()仅使用该种子来生成序列中的下一个数字。

这样的事情(非常粗略的实现,只是为了解释这个想法):

const int RAND_MAX = 32767; // usually it is 2^15, but actually implementation specific
const int a = ...;          // implementation specific
const int c = ...;          // implementation specific
int seed = 0;               // current generator state

void srand(int _seed) {
  seed = _seed;
}

int rand() {
  int r = (a * seed + c) % RAND_MAX;
  seed = r;
  return r;
}

它将为相同的初始状态(种子值)创建相同的序列。