#include <stdio.h>
#include <time.h>
/*
問題1:線形合同法により乱数を作って200個値を出力してください
問題2:ラグ付フィボナッチ法により乱数を作って200個の値を出力してください。
ただしx[0]~x[31]は線形合同法により初期化します・
問題3:mt_algo.cのmain.cを作成して分割コンパイルし実行しなさい
*/
/* 問題1 */
static unsigned long myrand_x; /* myrand用 前回のrand結果 */
void mysrand(unsigned long x){
myrand_x = x;
}
unsigned long myrand(){
return ( myrand_x = (1103515245UL * myrand_x + 12345) & 0x7FFFFFFF );
}
/* 問題2 */
#define BUFSIZE 32 /* 2のべき乗限定 */
#define BUFSIZEMASK BUFSIZE-1
static unsigned long myrandom_x[BUFSIZE]; /* myrandom用 乱数配列 */
static unsigned int myrandom_i; /* myrandom用 次回インデックス */
void mysrandom(unsigned long x){
int i;
mysrand(x);
for(i=0;i<BUFSIZE;i++){
myrandom_x[i] = myrand();
}
myrandom_i = 0;
}
unsigned long myrandom(){
unsigned int i = myrandom_i;
myrandom_i = (i+1) & BUFSIZEMASK;
return ( myrandom_x[i] =
myrandom_x[ (i+BUFSIZE-3 ) & BUFSIZEMASK ] +
myrandom_x[ (i+BUFSIZE-31) & BUFSIZEMASK ] );
}
/* 問題3 */
#define KEYLEN 100
void mt_seed(unsigned int s);
void init_by_array(unsigned long init_key[], int key_length);
unsigned long genrand_int32(void);
long genrand_int31(void);
double genrand_real1(void);
double genrand_real2(void);
double urand(void);
int nrand(int n);
double genrand_res53(void);
int main(){
int i;
unsigned long init_key[KEYLEN];
/* 問題1 */
printf("-- LCGs --\n");
mysrand(time(NULL));
for(i=0;i<200;i++){
printf("%3d: %08lx\n",i,myrand());
}
/* 問題2 */
printf("-- Lagged Fibonacci --\n");
mysrandom(time(NULL));
for(i=0;i<200;i++){
printf("%3d: %08lx\n",i,myrandom());
}
/* 問題3 *//* 全部の関数が呼べればOK?問題がよくわからん */
#if 0
mt_seed(time(NULL));
printf("genrand_int32: %08lx\n",genrand_int32());
printf("genrand_int31: %08lx\n",genrand_int31());
printf("genrand_real1: %f\n",genrand_real1());
printf("genrand_real2: %f\n",genrand_real2());
printf("urand : %f\n",urand());
printf("nrand(10) : %d\n",nrand(10));
printf("nrand(100) : %d\n",nrand(100));
printf("genrand_res53: %.16f\n",genrand_res53());
mysrandom(time(NULL));
for(i=0;i<KEYLEN;i++){
init_key[i]=myrandom();
}
init_by_array(init_key,KEYLEN);
printf("genrand_int32: %08lx\n",genrand_int32());
printf("genrand_int31: %08lx\n",genrand_int31());
printf("genrand_real1: %f\n",genrand_real1());
printf("genrand_real2: %f\n",genrand_real2());
printf("urand : %f\n",urand());
printf("nrand(10) : %d\n",nrand(10));
printf("nrand(100) : %d\n",nrand(100));
printf("genrand_res53: %.16f\n",genrand_res53());
#endif
return 0;
}