C++ 在库中使用srand()的问题

C++ 在库中使用srand()的问题,c++,c,random,software-design,C++,C,Random,Software Design,在具有预定义种子的第三方库中,广泛使用了srand()/rand()调用。在同一过程中组合不同的库时会出现问题。有时很难确保正确的调用顺序,可以混合使用srand()和rand()调用。另一个问题是无法在应用程序级别选择种子设定值。作为一般规则,我们是否应该避免在库中使用srand()(包括开源),将种子设定任务留给应用程序执行?如果库使用硬编码种子,那么是的,您应该有办法将这些种子更改为您声明为“足够随机”的种子 此外,如果您使用的平台具有类似于/dev/urad的功能,您可能会使用它,或者如

在具有预定义种子的第三方库中,广泛使用了
srand()/rand()
调用。在同一过程中组合不同的库时会出现问题。有时很难确保正确的调用顺序,可以混合使用
srand()
rand()
调用。另一个问题是无法在应用程序级别选择种子设定值。作为一般规则,我们是否应该避免在库中使用
srand()
(包括开源),将种子设定任务留给应用程序执行?

如果库使用硬编码种子,那么是的,您应该有办法将这些种子更改为您声明为“足够随机”的种子


此外,如果您使用的平台具有类似于/dev/urad的功能,您可能会使用它,或者如果您必须是多平台的,为什么不使用类似于OpenSSL的随机数库呢?OpenSSL可能在您所针对的每个平台上都可用,而且通常已经安装,因此您只需将其链接。

出于您提到的原因,以及其他原因,在实际应用程序中,最好使用
boost::random
或C++11
random

,或者您可以使用本世纪设计的随机API,它不依赖于单个全局种子。实际上,
rand()
是一个糟糕的、设计糟糕、实现糟糕的API。如果您的库需要一个随机生成器,请使用一个合适的生成器,它不会影响进程的全局状态。每个合适的库都应该依赖于实际用户来调用srand()。如果您在调用srand()的地方使用第三方工具,请告诉他们这是非常糟糕的做法,让世界变得更美好:)@AndreasGrapentin。Zlib、SSL、UPNP等调用srand()。意识到存在此问题,此代码来自ffmpeg:#未定义srand#定义srand#由于#状态(u trashing)使用(u av)lfg而禁止(u srand)_init@AndreasGrapentin:它被破坏了,因为它依赖于单个全局种子,这意味着它不是线程安全的,也意味着不能实例化多个随机生成器。它之所以被打破,是因为它的典型实现通常是非常劣质的,几乎是随机的,而且因为任何人期望从它那里得到任何接近正态分布的东西都会非常失望。真的,你会说什么是不坏的呢?一个设计糟糕的API,使不正确的使用变得容易,使正确的使用变得困难,再加上一个糟糕的实现,它会绊倒应该正确的使用。如果它让你感觉更好,我可以同意称它为“蹩脚的”,而不是坏掉的。但重点仍然是,你应该使用一个更好的选择。如<>代码>::C++的随机< /代码>。或者是操作系统提供的,比如
/dev/urand
,或者OpenSSL的实现,或者…C++11随机性很好,我同意,但是第三方库通过srand()调用自行管理随机性。我找不到任何来源证实boost::random使用srand/rand。你能提供这个声明的参考吗?boost::random没有问题。许多其他开源库都存在问题,例如ZLIB。在这种情况下,唯一的方法是修改第三方库。它使迁移到新版本变得复杂。@DavidKhosid那么,如果库写得不好,为什么不更改它呢?实际上,我们需要搜索每个第三方库以查找此设计缺陷(objdump),并为我们引入到项目中的每个版本修改库。我希望库不会无条件地调用srand()。