mrand48() - 疑似乱数の生成

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <stdlib.h>

long int mrand48(void);

機能説明

関数 drand48()、erand48()、jrand48()、lrand48()、mrand48()、および nrand48() は、線 形合同アルゴリズムと 48 ビット整数算術を使用して、一様分布疑似乱数を生成します。

関数 drand48() と erand48() は、区間 [0.0,1.0) に一様に分布する、負でない倍精度の浮動小数点値を戻します。

関数 lrand48() と nrand48() は、区間 [0,2**31) に一様に分布する負でない長整数を戻します。

関数 mrand48() と jrand48() は、区間 [-2**31,2**31) に 一様に分布する符号付き長整数を戻します。

mrand48() 関数は、次の線形合同式に従って、48 ビットの整数値の シーケンスに次の 48 ビットの整数値 X(i) を生成します。
X(n+1) = (aX(n) + c)mod(2**48)     n>=0
X、a、および c の初期値は以下のとおりです。
X(0) = 1
a   = 5deece66d (base 16)
c   = b         (base 16)

C/370™ は、シーケンスの最新の 48 ビット整数値 X(i) を保管するストレージを提供します。このストレージは、関数 drand48()、lrand48()、および mrand48() で共用されます。このストレージ内の値 X(n) は、関数 lcong48()、seed48()、または srand48() の呼び出しによって 再初期化されます。同様に、a と c の値も、lcong48() 関数を呼び出して 変更することができます。その後、X(n) を変更するために seed48() 関数または srand48() 関数 が呼び出されると、a および c の初期値も再設定されます。

z/OS®UNIX サービスの特殊な動作

drand48 ファミリーの関数を呼び出す前に、環境変数 _RAND48 を値 THREAD に 設定することによって、mrand48() 関数および drand48 ファミリーのその他の関数をスレッド固有 のものにすることができます。

drand48 ファミリーにスレッド固有の動作を要求しない場合は、マルチスレッド・アプリケーションで関数が呼び出されるとき、C/370 により drand48 ファミリーの関数ごとに X(n)、a、および c 用のストレージへのアクセスが シリアライズされます。

スレッド固有の動作が要求され、かつ mrand48() 関数がスレッド t から呼び出される場合、mrand48() 関数は、スレッド t の 48 ビット整数値のシーケンスに次の 48 ビット整数値 X(t,i) を生成します。スレッド用の値のシーケンスは、次の線形合同式に従って生成されます。
X(t,n+1) = (a(t)X(t,n) + c(t))mod(2**48)     n>=0
スレッド t の X(t)、a(t)、および c(t) の初期値は 以下のとおりです。
X(t,0) = 1
a(t)   = 5deece66d (base 16)
c(t)   = b         (base 16)

C/370 は、関数 drand48()、lrand48()、または mrand48() で生成されるシーケンスの最新の 48 ビット整数値 X(t,i) を保管するため、t スレッド固有のストレージを提供します。 このストレージ内の値 X(t,n) は、スレッド t から関数 lcong48()、 seed48() または srand48() を呼び出すことにより再初期化されます。同様に、スレッド t の a(t) および c(t) の値も、スレッドから の lcong48() 関数呼び出しによって変更することができます。 その後、X(t,n) を変更するために、スレッド t から関数 seed48() または srand48() が呼び出されるたびに、a(t) と c(t) の初期値も再設定されます。

戻り値

mrand48() は、生成された 48 ビットの値 X(n+1) を [-2**31,2**31) 区間で符号付き長整数値に変換し、この変換値を戻します。

z/OSUNIX サービスの特殊な動作

スレッド固有の動作が drand48 ファミリーに要求され、mrand48() 関数がスレッド t で呼び出される場合、mrand48() 関数は、生成された 48 ビットの値 X(t,n+1) を [-2**31,2**31) 区間で符号付き長整数値に変換し、この変換値を戻します。

関連情報