首页 > 解决方案 > 什么是默认种子?

问题描述

当我调用以下函数时:

printf("%d\n", rand())
srand(0);
printf("%d\n", rand());

我一直得到以下输出:

1804289383
1804289383

这个数字之前代表srand()什么?如果关键是要满足srand要求。为什么它不初始化为类似0或其他的-1东西?

标签: crandom

解决方案


“种子”设置了伪随机数生成器的状态,尽管是以一种不明显的方式。但是,每当您使用相同的号码播种时,您总是会从rand(). 对于 C 库中的 PRNG 实现(似乎是 glibc),看起来种子 0 会导致下一个随机数 1804289383。

数字 1804289383 没有什么神奇或意义,它恰好是 C 库的 PRNG 在种子值为 0 后踢出的数字。

这有点令人困惑,为什么前面的调用rand()——你程序中的第一个调用——也返回相同的值 1804289383。起初这让我很困惑,因为在启动时,C 库rand()应该表现得好像它的种子值为 1。但事实证明,解释是 glibc 的 PRNG 也恰好将种子 1 变为下一个值 1804289383。

思考srand()可能会令人困惑。有关更多解释,请参阅this answer to this question,以及this old question


推荐阅读