对加密不安全的随机数使用rand()是否可以接受?

Gav*_*ard 3 c random

是否可以接受使用C标准库的rand()函数,该函数都随机数并不必须加密安全?如果是这样,还有更好的选择吗?如果没有,应该使用什么?

当然,我认为关于偏斜常见警告适用。

Ste*_*mit 5

除了加密安全性之外,有很多系统rand()具有相当严重的随机性属性,如果您需要更好的东西,标准建议是使用非标准random().

rand在许多系统上的不良特性包括:

  • 低阶位的非随机性(例如rand()%2保证交替 0,1,0,1...)。
  • 周期相对较短,或许“仅”40亿左右

所以我(不情愿的)建议是,如果您需要“良好”的随机性(例如,对于蒙特卡罗模拟),您可能非常想使用非标准替代品进行研究rand()。(我关于 C 的永恒问题之一是为什么任何供应商都会花时间部署非标准random()而不是简单地制作rand()。我确实知道规范的答案,尽管它们很糟糕。)

另请参阅这个类似的问题


dor*_*ron 5

rand() 遭受一些严重的弊端。

  1. 不能保证随机数的质量。实施与实施之间会有所不同。
  2. 不保证对rand的不同调用所使用的共享状态是线程安全的。

至于POSIX C替代品,有randomrandom_r。OpenSSL提供了更多先进的生成随机数的方法。

如果可以选择在项目中包含C ++,则C ++(C ++ 11和更高版本)库还提供了许多随机数函数。


Ayx*_*xan 3

rand()是的,用来获取伪随机数是可以的。事实上,这就是整个要点rand()。对于简单的任务,可以确定性,您甚至可以为简单起见设置系统时钟。

  • rand() 的“重点”确实是获取伪随机数,但它因实现不佳而臭名昭著,不应该在不谨慎的情况下推荐。即使 OP 不需要加密安全性,他们的需求可能仍然超出了糟糕的“rand”实现所提供的范围。根据 C 2018 标准,“无法保证所生成的随机序列的质量,并且已知某些实现会生成具有令人痛苦的非随机低阶位的序列。” (4认同)