可能重复:
随机数生成器如何工作?
C 编译器如何决定是否应该在随机数生成函数中生成下一个数字?例如,它总是在给定范围内生成一个新的随机数。这是怎么做的?
它通过保持一些状态并在每次调用函数时修改状态来生成下一个数字。这样的函数称为伪随机数生成器。 创建 PRNG 的一种旧方法是线性同余生成器,这很简单:
static int rand_state;
int rand(void)
{
rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
return rand_state;
}
如您所见,如果您知道前一个数字,则此方法允许您预测系列中的下一个数字。还有更复杂的方法。
已经为特定目的设计了各种类型的伪随机数发生器。有一些安全的 PRNG,虽然速度很慢,但即使你知道它们是如何工作的也很难预测,还有像 Mersenne Twister 这样的大型 PRNG,它们具有很好的分布特性,因此对于编写 Monte Carlo 模拟很有用。
根据经验,线性同余生成器足以编写游戏(怪物造成多少伤害),但不足以编写模拟。研究人员选择较差的 PRNG 用于他们的项目的历史是丰富多彩的。因此,他们的模拟结果令人怀疑。
它不是一个编译器,而是一个 C 库,它具有生成伪随机(不是真正的随机!)数字的功能。
通常为此使用线性同余生成器。
好吧,C 编译器不会做出这样的决定。下一个随机数取决于算法。生成随机数并不是一件容易的事。看一眼
这其实是一个很大的话题。一些关键的事情: