prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 13.21

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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管