cc [ flag ... ] file ... -lsunmath -lm [ library ... ]
#include <sunmath.h>
int i_addran_(void);
float r_addran_(void);
double d_addran_(void);
void i_addrans_(int *x, int *n, int *l, int *u);
void u_addrans_(unsigned *x, int *n, unsigned *l, unsigned *u);
void r_addrans_(float *x, int *n, float *l, float *u);
void d_addrans_(double *x, int *n, double *l, double *u);
void i_get_addrans_(int *x);
void r_get_addrans_(float *x);
void d_get_addrans_(double *x);
void i_set_addrans_(int *x);
void r_set_addrans_(float *x);
void d_set_addrans_(double *x);
void i_init_addrans_(void);
void r_init_addrans_(void);
void d_init_addrans_(void);
这些函数生成类型为 int、unsigned int、float 或 double 的均匀分布的随机数。每个函数采用重复出现的形式生成序列中的下一个随机数
next = table[i] - table[(i - 24) % ADDRAN_SIZE]; table[i] = next; i = (i + 1) % ADDRAN_SIZE;
在内部,这些函数为程序中的每个线程维护三个单独的 ADDRAN_SIZE 元素表。ADDRAN_SIZE 在 <sunmath.h> 中定义。
i_addran_() 返回一个随机的 32 位整数。后续数字以 32 位整数算术计算(即 2**32 取模),因此在范围 -2147483648, ..., 2147483647 中。
r_addran_() 返回一个介于 0 和 1 - 2**-24 之间的随机单精度浮点数。后续数字在必要时加 1 保持在此范围内。
d_addran_() 返回一个介于 0 和 1 - 2**-53 之间的随机双精度浮点数。后续数字在必要时加 1 保持在此范围内。
i_addrans_(n, x, l, u)、u_addrans_(n, x, l, u)、r_addrans_(n, x, l, u) 和 d_addrans_(n, x, l, u) 分别以随机的 32 位有符号整数、32 位无符号整数、单精度浮点数和双精度浮点数填充数组元素 x[0], ..., x[*n-1]。这些数经过比例缩放和偏移,以便在间隔 [*l, *u] 上均匀分布。
i_get_addrans_(x) 使用 i_addran_ 使用的当前表值填充 x[0], ..., x[ADDRAN_SIZE-1]。i_set_addrans_(x) 使用值 x[0], ..., x[ADDRAN_SIZE-1] 填充此表。i_init_addrans_() 将此表重置为其初始状态。
r_get_addrans_(x) 使用 r_addran_ 使用的当前表值填充 x[0], ..., x[ADDRAN_SIZE-1]。r_set_addrans_(x) 使用值 x[0], ..., x[ADDRAN_SIZE-1] 填充此表。r_init_addrans_() 将此表重置为其初始状态。
d_get_addrans_(x) 使用 d_addran_ 使用的当前表值填充 x[0], ..., x[ADDRAN_SIZE-1]。d_set_addrans_(x) 使用值 x[0], ..., x[ADDRAN_SIZE-1] 填充此表。d_init_addrans_() 将此表重置为其初始状态。
i_addrans_ 和 u_addrans_ 使用同一个表作为 i_addran_。r_addrans_ 使用同一个表作为 r_addran_。d_addrans_ 使用同一个表作为 d_addran_。例如,在调用 i_init_addrans_ 之后立即调用 i_addran_ 所得的结果将不同于依次调用 i_init_addrans_、u_addrans_ 和 i_addran_。一个程序中的不同线程使用不同的表,但是,在一个线程中调用其中的一个函数不会影响从另一个线程调用同一个函数时提供的值。
要生成 1000 个 [0,1) 范围内的双精度随机数:
double x[1000]; int i; for (i = 0; i < 1000; i++) x[i] = d_addran_();
使用以下算法可以更高效地生成同样的数:
double x[1000], lb, ub; int n = 1000; lb = D_ADDRAN_LB; /* defined in <sunmath.h> */ ub = D_ADDRAN_UB; /* defined in <sunmath.h> */ d_addrans_(x, &n, &lb, &ub);
要生成 1000 个介于 -10 和 10 之间的随机整数:
int x[1000], n = 1000, lb = -10, ub = 10; i_addrans_(x, &n, &lb, &ub);
有关下列属性的说明,请参见 attributes(5):
|
drand48(3C)、lcrans(3M)、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) 生成器。