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) は、配列要素 x[0], ..., x[*n-1] に、それぞれ 32 ビットの符号付き整数、32 ビットの符号なし整数、単精度浮動小数点、倍精度浮動小数点の乱数を挿入します。間隔 [*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_ の順に呼び出す場合では結果が異なります。ただし、プログラム内のスレッドごとに異なるジェネレータを使用するため、これらの関数のいずれかをあるスレッドで呼び出すときに、同じ関数が別のスレッドから呼び出されても、生成される値は影響を受けません。
[0,1] で 1000 個の倍精度乱数を生成するには:
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);
-10 から 10 までの範囲で 1000 個の整数乱数を生成するには:
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』、1981 年、Addison-Wesley。
Park、Miller 共著、『Random Number Generators: Good Ones are Hard to Find』、Communications of the ACM、1988 年 10 月。
一般に、addrans(3M) ジェネレータは、lcrans(3M) または mwcrans(3M) ジェネレータよりも高速です。