Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

lcrans(3M)

名前

lcrans - 線形合同疑似乱数ジェネレータ

形式

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

説明

これらの関数は、intunsigned intfloat、または 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) を参照してください。

属性タイプ
属性値
インタフェースの安定性
確実
MT レベル
MT-安全

関連項目

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) ジェネレータよりも高速です。