【发布时间】:2010-09-24 06:56:32
【问题描述】:
我需要一种“好的”方法来初始化 C++ 中的伪随机数生成器。我发现an article 指出:
为了生成随机类 数字,srand 通常被初始化 到一些独特的价值,比如那些 与执行时间有关。为了 例如,返回的值 功能时间(在标题中声明 ctime) 每秒都不同,这 对大多数人来说足够独特 随机需求。
Unixtime 对我的应用程序来说不够独特。初始化它的更好方法是什么?如果它是可移植的,则加分,但代码将主要在 Linux 主机上运行。
我正在考虑做一些 pid/unixtime 数学来获得一个 int,或者可能从 /dev/urandom 读取数据。
谢谢!
编辑
是的,我实际上每秒启动我的应用程序多次并且遇到了冲突。
【问题讨论】:
-
为什么 time() 不够?您是否在一秒钟内多次启动应用程序?请注意,您应该只在应用程序中调用一次 srand()。
-
如果 time() - 或 gettimeofday() - 还不够,那么 rand() 可能对您来说还不够好。 PRNG 根本不需要非常好。密码随机性很难 - 使用密码库。
-
实际上至少 MS CRT 将种子保存在 TLS 中,因此在这种情况下,您实际上需要为每个线程初始化一次 srand() 。但不确定 GCC 是如何存储种子的。
-
更多关于用微秒初始化 srand() 的信息:guyrutenberg.com/2007/09/03/seeding-srand
-
相关:How I hacked Hacker News。 HN 以毫秒为单位使用时间作为种子,然后使用 RNG 生成登录 cookie。攻击者可以通过登录他们的帐户,接收 cookie 来恢复种子,然后枚举可能的种子并根据 cookie 检查每个种子,直到找到匹配项。有了正确的种子,他们就可以预测其他用户的 cookie,并以这些用户的身份在网站上执行操作。