cc [ flag ... ] file ... -lsunmath -lm [ library ... ]
#include <sunmath.h>
int i_lcran_(void);
float r_lcran_(void);
double d_lcran_(void);
void i_lcrans_(int *x, int *n, int *l, int *u);
void u_lcrans_(unsigned *x, int *n, unsigned *l, unsigned *u);
void r_lcrans_(float *x, int *n, float *l, float *u);
void d_lcrans_(double *x, int *n, double *l, double *u);
void i_get_lcrans_(int *x);
void i_set_lcrans_(int *x);
void i_init_lcrans_(void);
这些函数生成类型为 int、unsigned int、float 或 double 的均匀分布的随机数。它们共享一个通用内部生成器,通过重复发生的方式生成介于 1 和 LCRAN_MODULUS - 1 之间的整数序列
next = (multiplier * last) % LCRAN_MODULUS
LCRAN_MODULUS 在 <sunmath.h> 中定义,具有值 2**32 - 1。乘数取决于所调用的函数,如下所述。
i_lcran_() 返回一个介于 1 和 LCRAN_MODULUS - 1 = 2**32 - 2 之间的随机整数。它始终使用值 16807 作为乘数。
r_lcran_() 返回一个介于 1/LCRAN_MODULUS 和 1 之间的随机单精度浮点数。它始终使用值 16807 作为乘数。
d_lcran_() 返回一个介于 1/LCRAN_MODULUS 和 1 - (1/LCRAN_MODULUS) 之间的随机双精度浮点数。它始终使用值 16807 作为乘数。
i_lcrans_(n, x, l, u)、u_lcrans_(n, x, l, u)、r_lcrans_(n, x, l, u) 和 d_lcrans_(n, x, l, u) 分别以随机的 32 位有符号整数、32 位无符号整数、单精度浮点数和双精度浮点数填充数组元素 x[0], ..., x[*n-1]。这些数经过比例缩放和偏移,以便在间隔 [*l, *u] 上均匀分布。这些函数使用最近的 i_set_lcrans_ 调用中提供的乘数;缺省乘数 16807 也通过 i_init_lcrans_ 重置。
i_get_lcrans_(x) 将 x[0] 设置为内部生成器生成的最后一个值,将 x[1] 设置为 i_lcrans_、u_lcrans_、r_lcrans_ 和 d_lcrans_ 使用的当前乘数。
i_set_lcrans_(x) 将内部生成器用于计算下一个随机数的值(即上面的重复项中的 last 的值)设置为 x[0],将 i_lcrans_、u_lcrans_、r_lcrans_ 和 d_lcrans_ 使用的乘数设置为 x[1]。last 的值应介于 1 和 LCRAN_MODULUS - 1 之间。仅使用乘数的最低有效 22 位。
i_init_lcrans_() 将 last 的值重置为 1,将乘数重置为 16807。
上面列出的所有函数都使用相同的内部生成器。因此,在调用 i_init_lcrans_ 之后立即调用 i_lcran_ 所得的结果将不同于依次调用 i_init_lcrans_、u_lcrans_ 和 i_lcran_。一个程序中的不同线程使用不同的生成器,但是,在一个线程中调用其中的一个函数不会影响从另一个线程调用同一个函数时提供的值。
要生成 1000 个 [0,1) 范围内的双精度随机数:
double x[1000]; int i; for (i = 0; i < 1000; i++) x[i] = d_lcran_();
使用以下算法可以更高效地生成同样的数:
double x[1000], lb, ub; int n = 1000; lb = D_LCRAN_LB; /* defined in <sunmath.h> */ ub = D_LCRAN_UB; /* defined in <sunmath.h> */ d_lcrans_(x, &n, &lb, &ub);
要生成 1000 个介于 -10 和 10 之间的随机整数:
int x[1000], n = 1000, lb = -10, ub = 10; i_lcrans_(x, &n, &lb, &ub);
有关下列属性的说明,请参见 attributes(5):
|
addrans(3M)、drand48(3C)、mwcrans(3M)、rand(3C)、random(3C)、shufrans(3M)、attributes(5)
Knuth 编著的《Seminumerical Algorithms》,Addison-Wesley 出版,1981。
Park 和 Miller 合著的《Random Number Generators: Good Ones are Hard to Find》,Communications of the ACM 出版,1988 年 10 月。
通常,addrans(3M) 生成器的速度快于 lcrans(3M) 或 mwcrans(3M) 生成器。