Oracle Solaris Studio 12.4 Man Pages

Exit Print View

Updated: January 2015
 
 

addrans(3M)

Name

addrans - 加法伪随机数生成器

Synopsis

 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); 

Description

这些函数生成类型为 intunsigned intfloatdouble 的均匀分布的随机数。每个函数采用重复出现的形式生成序列中的下一个随机数

 
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_。一个程序中的不同线程使用不同的表,但是,在一个线程中调用其中的一个函数不会影响从另一个线程调用同一个函数时提供的值。

Examples

要生成 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

有关下列属性的说明,请参见 attributes(5):

属性类型
属性值
接口稳定性
Committed(已确定)
MT 级别
MT-Safe(MT 安全)

See also

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 月。

Notes

通常,addrans(3M) 生成器的速度快于 lcrans(3M) 或 mwcrans(3M) 生成器。