乱数ライブラリ プログラム・ヘッダ


index 目次




[ 簡単な説明 ]

乱数ライブラリで使用する関数のプロトタイプ宣言を行います。

1. 一様乱数

urnd( ) 乗算合同法
mrnd( ) M系列(周期 : 2521 - 1 ≒ 6.86×10156
rrnd( ) 乗算合同法(周期 : 約6.95×1012
ornd( ) Park and Miller 乗算合同法 (周期 : 231 - 2 = 2147483646)
brnd( ) Park and Miller 乗算合同法 + Bays-Durham 切り混ぜ法
ernd( ) L'Ecuyer 2種の乗算合同法組合せ(周期:約2.3×1018)
+ Bays-Durham 切り混ぜ法
krnd( ) Knuth 減算法
drnd( ) データ暗合化に基づく乱数列
qrnd( ) 線形合同法(高速生成法)
prnd( ) ポータブルな乱数生成ルーチン(拙速生成法)


2. 整数乱数                index (目次に戻る)

irnd( ) max 〜 min の範囲の整数乱数


3. その他乱数

gaussd( ) ボックス−マラー法による正規乱数(高速・改良版)
tri_rand( ) 三角分布乱数
exp_rand( ) 指数分布乱数
binornal( ) 2変量正規分布乱数
rnd_vector( ) ベクトル乱数
rnd_vector3( ) 3次元ベクトル乱数


4. ランダム・データ生成関数

mkdata_i( ) int 型ランダム・データ生成関数
mkdata_d( ) double 型ランダム・データ生成関数
mkdata_s( ) 文字型ランダム・データ生成関数
mkdata_sd( ) 文字列型ランダム・データ生成関数


5. データ撹拌関数

shuffle_i( ) int 型データ攪拌関数
shuffle_d( ) double 型データ攪拌関数
shuffle_c( ) 文字型データ攪拌関数


6. 無作為抽出関数

pickup( ) int 型データ無作為抽出関数

プログラム・ソース("random.h")                   index (目次に戻る)
/*		random.h		*/
#ifndef		_RANDOM_

#define		_RANDOM_

#include <math.h>
#include <string.h>

#define		MASK	123459876L	/* 初期化マスク(任意定数)*/
#define		NTAB	32			/* brnd(),ernd() 関連配列サイズ */
#define		MBIG	2147483647	/* krnd()関連定数 */
#define		MSEED	161803398	/*      〃        */
#define		ulong		unsigned long
#define		_M			17			/* 一様乱数の種類 */
#define		_MP			34			/* 一様乱数(拙速生成法)の種類 */

/*	random.c	*/
void _error(char *s, int r);
void init_urnd0(long seed);
void init_urnd1(long seed);
void init_urnd2(long seed);
void init_urnd3(long seed);
void init_urnd4(long seed);
void init_urnd5(long seed);
void init_urnd6(long seed);
void init_mrnd(long seed);
void init_rrnd(long seed);
void init_ornd0(long seed);
void init_ornd1(long seed);
void init_ornd2(long seed);
void init_brnd(long seed);
void init_ernd(long seed);
void init_krnd(long seed);
void init_drnd(long seed);
void init_qrnd(long seed);
long init_prnd0(long seed);
long init_prnd1(long seed);
long init_prnd2(long seed);
long init_prnd3(long seed);
long init_prnd4(long seed);
long init_prnd5(long seed);
long init_prnd6(long seed);
long init_prnd7(long seed);
long init_prnd8(long seed);
long init_prnd9(long seed);
long init_prnd10(long seed);
long init_prnd11(long seed);
long init_prnd12(long seed);
long init_prnd13(long seed);
long init_prnd14(long seed);
long init_prnd15(long seed);
long init_prnd16(long seed);
long init_prnd17(long seed);
long init_prnd18(long seed);
long init_prnd19(long seed);
long init_prnd20(long seed);
long init_prnd21(long seed);
long init_prnd22(long seed);
long init_prnd23(long seed);
long init_prnd24(long seed);
long init_prnd25(long seed);
long init_prnd26(long seed);
long init_prnd27(long seed);
long init_prnd28(long seed);
long init_prnd29(long seed);
long init_prnd30(long seed);
long init_prnd31(long seed);
long init_prnd32(long seed);
long init_prnd33(long seed);

double urnd0(void);
double urnd1(void);
double urnd2(void);
double urnd3(void);
double urnd4(void);
double urnd5(void);
double urnd6(void);
void rnd521(void);
double mrnd(void);
double rrnd(void);
double ornd0(void);
double ornd1(void);
double ornd2(void);
double brnd(void);
long bcal(void);
double ernd(void);
long ecal1(void);
long ecal2(void);
double krnd(void);
double drnd(void);
double qrnd(void);
double prnd0(void);
double prnd1(void);
double prnd2(void);
double prnd3(void);
double prnd4(void);
double prnd5(void);
double prnd6(void);
double prnd7(void);
double prnd8(void);
double prnd9(void);
double prnd10(void);
double prnd11(void);
double prnd12(void);
double prnd13(void);
double prnd14(void);
double prnd15(void);
double prnd16(void);
double prnd17(void);
double prnd18(void);
double prnd19(void);
double prnd20(void);
double prnd21(void);
double prnd22(void);
double prnd23(void);
double prnd24(void);
double prnd25(void);
double prnd26(void);
double prnd27(void);
double prnd28(void);
double prnd29(void);
double prnd30(void);
double prnd31(void);
double prnd32(void);
double prnd33(void);

void init_irnd(void (*_init)(long s), double (*_rnd)(void), long seed);
int irnd(int max, int min);
void init_gaussd(void (*_init)(long s), double (*_rnd)(void), long seed);
double gaussd(double av, double st);
void init_tri_rand(void (*_init)(long s), double (*_rnd)(void), long seed);
double tri_rand(void);
void init_exp_rand(void (*_init)(long s), double (*_rnd)(void), long seed);
double exp_rand(void);
void init_binormal(void (*_init)(long s), double (*_rnd)(void), long seed);
void binormal(double r, double *x, double *y);
void init_rnd_vector(void (*_init)(long s), double (*_rnd)(void), long seed);
void rnd_vector(double *x, double *y);
void init_rnd_vector3(void (*_init)(long s), double (*_rnd)(void), long seed);
void rnd_vector3(double *x, double *y, double *z);

/*	global variables */
extern ulong _idum_u0, _idum_u1, _idum_u2;		/* urnd0()〜urnd6()の乱数核 */
extern ulong _idum_u3, _idum_u4, _idum_u5;		/*      〃        */
extern ulong _idum_u6;							/*      〃        */
extern ulong *_prx, *_prx_end;					/* mrnd()の乱数核ほか変数 */
extern ulong _rx[522];							/*      〃        */
extern unsigned int r_s1, r_s2, r_s3;			/* rrnd()の乱数核ほか変数 */
extern long _idum_o0, _idum_o1, _idum_o2;		/* ornd0()〜ornd2()の乱数核 */
extern long _idum_b, b_nd, b_iy;				/* brnd()の乱数核ほか変数 */
extern long b_iv[NTAB];							/*      〃        */
extern long _idum_e1, _idum_e2, e_nd, e_iy;		/* ernd()の乱数核ほか変数 */
extern long e_iv[NTAB];							/*      〃        */
extern long *k_ma_end, *pk1, *pk2;				/* krnd()の乱数核ほか変数 */
extern long k_ma[57];							/*      〃        */
extern ulong _idum_d;							/* drnd()の乱数核 */
extern ulong _idum_q;							/* qrnd()の乱数核 */
extern ulong _idum_p0, _idum_p1, _idum_p2;		/* prnd0()〜prnd33()の乱数核 */
extern ulong _idum_p3, _idum_p4, _idum_p5;		/*      〃        */
extern ulong _idum_p6, _idum_p7, _idum_p8;		/*      〃        */
extern ulong _idum_p9, _idum_p10, _idum_p11;	/*      〃        */
extern ulong _idum_p12, _idum_p13, _idum_p14;	/*      〃        */
extern ulong _idum_p15, _idum_p16, _idum_p17;	/*      〃        */
extern ulong _idum_p18, _idum_p19, _idum_p20;	/*      〃        */
extern ulong _idum_p21, _idum_p22, _idum_p23;	/*      〃        */
extern ulong _idum_p24, _idum_p25, _idum_p26;	/*      〃        */
extern ulong _idum_p27, _idum_p28, _idum_p29;	/*      〃        */
extern ulong _idum_p30, _idum_p31, _idum_p32;	/*      〃        */
extern ulong _idum_p33;							/*      〃        */

static char _pname[_M][7] = 
		{"urnd0", "urnd1", "urnd2", "urnd3", "urnd4", "urnd5",
		 "urnd6", "mrnd",  "rrnd",  "ornd0", "ornd1", "ornd2",
		 "brnd" , "ernd",  "krnd",  "drnd" , "qrnd" };
static double (*_func[_M])(void) =
		{urnd0, urnd1, urnd2, urnd3, urnd4, urnd5, urnd6, mrnd, rrnd,
		 ornd0, ornd1, ornd2, brnd,  ernd,  krnd,  drnd,  qrnd };
static void (*_init[_M])(long s) =
		{init_urnd0, init_urnd1, init_urnd2, init_urnd3, init_urnd4, init_urnd5,
		 init_urnd6, init_mrnd,  init_rrnd,  init_ornd0, init_ornd1, init_ornd2,
		 init_brnd,  init_ernd,  init_krnd,  init_drnd,  init_qrnd };
static double (*_func_p[_MP])(void) = {
	prnd0,  prnd1,  prnd2,  prnd3,  prnd4,  prnd5,  prnd6,  prnd7,  prnd8,
	prnd9,  prnd10, prnd11, prnd12, prnd13, prnd14, prnd15, prnd16, prnd17,
	prnd18, prnd19, prnd20, prnd21, prnd22, prnd23, prnd24, prnd25, prnd26,
	prnd27, prnd28, prnd29, prnd30, prnd31, prnd32, prnd33 };
static long (*_init_p[_MP])(long s) = {
	init_prnd0,  init_prnd1,  init_prnd2,  init_prnd3,  init_prnd4,
	init_prnd5,  init_prnd6,  init_prnd7,  init_prnd8,  init_prnd9,
	init_prnd10, init_prnd11, init_prnd12, init_prnd13, init_prnd14,
	init_prnd15, init_prnd16, init_prnd17, init_prnd18, init_prnd19,
	init_prnd20, init_prnd21, init_prnd22, init_prnd23, init_prnd24,
	init_prnd25, init_prnd26, init_prnd27, init_prnd28, init_prnd29,
	init_prnd30, init_prnd31, init_prnd32, init_prnd33 };

extern double (*_rand)(void);				/* 一様乱数以外の乱数で呼び出す一様分布乱数 */ 
extern double _tri;

/* ランダム・データ生成関数 */
void init_mkdata(void (*initfunc)(long s), double (*func)(void), long seed);
int *mkdata_i(int n, int min, int max);
unsigned char *mkdata_c(int n, unsigned char min, unsigned char max);
double *mkdata_d(int n, double min, double max);
unsigned char **mkdata_s(int n, int smin, int smax, unsigned char min, unsigned char max);
unsigned char **mkdata_sd(int n, int smin, int smax, unsigned char min, unsigned char max);

/* データ撹拌関数 */
void shuffle_i(int *a, int n, long seed);
void shuffle_d(double *a, int n, long seed);
void shuffle_c(unsigned char **a, int n, long seed);

/* 無作為抽出関数 */
void init_pickup(void (*init)(long s), double (*rnd)(void), long seed);
void pickup(int m, int n, int *pick);

#endif