我知道rand()
和srand()
的相互关系,我知道如何使用它们,但是它们的工作机制对我来说真的很有趣,我想知道他们是如何工作的?!,但是我找不到任何特别的东西。
这是我的问题:rand()
和srand()
的内部发生了什么,它如何产生一个随机数? (如果确实是产生一个随机数!)它是否具有任何特殊的数学计算或特殊的算法?是什么?
答案 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;
}
它将为相同的初始状态(种子值)创建相同的序列。