c - 为什么可重入随机生成器 rand_r() 被认为是弱的?
问题描述
状态的手册页rand_r()
:
rand_r() 的 seedp 参数所指向的值仅提供非常少量的状态,因此该函数将是一个弱伪随机生成器。
有人能解释一下这句话是什么意思吗?种子值如何“只提供非常少量的状态”,这又如何削弱生成器?
在我开始使用 GNU 扩展drand48_r()
作为更好的选择之前,我想确保我做出了明智的选择。也许对于某些用例rand_r()
来说就足够了,否则它的可用性将毫无意义。
编辑回应评论:
我希望更好地理解功能和解释它们的方式,最好不要参考可能限制解释的特定用例。网上讨论了很多用例,但是关于功能的一般知识要么缺乏要么难以理解。SO过去在问答介绍方面做得很好,因此是我的问题。
如果有帮助,我已经做了一个测试来比较rand()
和rand_r()
,生成两个随机 RGB 图像,其中像素是通过以下方式生成的:
pxsPtr[i] = (uint8_t) rand() % 255; // rand() version
pxsPtr[i] = (uint8_t) rand_r(&randRseed) % 255; // rand_r() version
我对它们的相似性感到惊讶,现在更渴望获得我问题的答案。
解决方案
推荐阅读
- python - Django 高效的一对多链查找
- java - 是什么让 Maven 想要使用 Zulu Java 11 的 openjfx 而不是 Zulu Java 8 用于 Spring Boot 项目?
- jenkins - npm 安装锁定管道 Jenkins
- javascript - 如何动态制作 C3.js 图表高度?
- angular - Angular 在版本 6 和 7 中从 url 中删除 index.aspx
- java - java spring boot hibernate不更新现有对象
- react-native - 如何使用 react-native 保存文件?
- ios - iOS:如何在多个 UIViews / UIViewControllers 之间投射阴影
- excel - 使用 VBA 检索形状值时出现活动错误 438
- oracle - 由于数据中的特殊字符,从 HDFS 到 ORACLE 的 Sqoop 导出失败