【发布时间】:2023-03-19 11:28:01
【问题描述】:
用于生成随机双打,有drand48,但是
这些函数被 SVID 3 声明为过时的,它指出 应该使用 rand(3)。
如何用 drand48 构造我的随机双精度数?另一方面, 随机浮动?
简单地连接来自rand() 的两个int 并且强制转换可能会导致
NaN,这是不可接受的。我想避免只使用 32 个随机数
双倍位。
【问题讨论】:
用于生成随机双打,有drand48,但是
这些函数被 SVID 3 声明为过时的,它指出 应该使用 rand(3)。
如何用 drand48 构造我的随机双精度数?另一方面, 随机浮动?
简单地连接来自rand() 的两个int 并且强制转换可能会导致
NaN,这是不可接受的。我想避免只使用 32 个随机数
双倍位。
【问题讨论】:
不幸的是,Linux 手册页中引用了一个过时的标准。如果我没看错,SVID 3 于 1986 年发布,并且已经过时了。 POSIX 具有这一系列功能,并且没有计划逐步淘汰它们。
但如果您愿意,请考虑使用erand48 而不是drand48。它的优点是您自己为其提供了种子状态。由于它是可重入的,如果您在线程环境中使用它(并以不同方式初始化线程的种子),它通常表现更好,或者如果您需要它进行可重现的模拟,它是确定性的。
唯一需要注意的是,它只提供 48 位的伪随机性。通常double 算法是52 位的,所以注意不要使用最低4 位,它们不好。
【讨论】: