c - 什么是默认种子?
问题描述
当我调用以下函数时:
printf("%d\n", rand())
srand(0);
printf("%d\n", rand());
我一直得到以下输出:
1804289383
1804289383
这个数字之前代表srand()
什么?如果关键是要满足srand
要求。为什么它不初始化为类似0
或其他的-1
东西?
解决方案
“种子”设置了伪随机数生成器的状态,尽管是以一种不明显的方式。但是,每当您使用相同的号码播种时,您总是会从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。
推荐阅读
- angular - 防止 Chrome 剥离 url 参数
- php - 有没有办法我可以更改 wordpress 主题以显示来自 2 个不同类别的帖子,而不是可以在横幅设置中设置的帖子
- graph - 如何对具有特征网络结构的数据使用深度学习?
- c# - 提供了无效的请求 URI。(堆栈跟踪中没有有用的信息)
- javascript - 如何将 1 个键值拆分为 2 个键值
- python-3.x - 在列中拆分多个值
- c# - 从字节[]显示图像,每次转换为图像时显示“无效参数”
- javascript - 即使从 MDN 复制,Await 也是保留字
- php - PHP Mail:蜜罐方法的概念
- django - 在 Django 中反应还是作为独立的反应?