Q我正在移植这个程序,它调用一个例程drand48,我的库里没有这个。这是什么?
A drand48是一个 Unix System V 例程,它返回浮点随机数(可能具有 48 位精度),范围在半开区间 [0, 1) 内[脚注]。(它的配套种子例程是srand48;两者都不在 C 标准中。)编写一个低精度替换例程很容易
#include <stdlib.h> double drand48() { return rand() / (RAND_MAX + 1.); }
为了更精确地模拟drand48的语义,您可以尝试为其提供接近 48 位的精度
#define PRECISION 2.82e14 /* 2**48, rounded up */ double drand48() { double x = 0; double denom = RAND_MAX + 1.; double need; for(need = PRECISION; need > 1; need /= (RAND_MAX + 1.)) { x += rand() / denom; denom *= RAND_MAX + 1.; } return x; }
然而,在使用此类代码之前,请注意它在数值上存在问题,特别是如果(通常情况下)rand的周期接近 RAND_MAX。(如果您有更长周期的随机数生成器可用,例如 BSD 的random,在模拟时请务必使用drand48.)
参考文献:PCS 第 11 章第 149 页