static double a=0.0;

void _srand64(int seed)
// 系列を設定する
{
	a=(double)seed;
}

int rand64(int base)
// rand()よりかなりバラ付きの良い乱数発生ルーチン
// ただし、バラ付きを良くするためにはbase<=63が好ましい(64の倍数-1なら良さそう)
// 系列は固定なので、変化させる時はsrand64()を使う
// 速度はrand2()の半分
{
	a=23.0*a+2345.0;
	a-=((double)((int)(a/4567.0))*4567.0);
	return ((int)((a/4567.0)*(double)base));
}

#include	<time.h>
#include	<iocslib.h>	// ONTIME()

void srand64()
/* rand64()乱数を初期化する */
{
time_t t;
static time_t ts=-1;
	time(&t);
	t+=ONTIME(); // 別プログラムを短時間に起動した時のため
	/* clock()はプロセス起動時からの時間なので、
	　　プログラム起動毎に同じ乱数を発生しやすいので使えない */
	if (t==ts) { // 同一プログラム中でごく短期間に再び初期化された時のため
		t+=rand64(ONTIME()%64);
	}
	ts=t;
	//printf("初期値:%d:",t);
	t&=0x0f;
	while (t-->0) rand64(63); // 適当な回数回す（最大１５回）
}

#if 0
#include <stdio.h>

void main()
{
int i,j;
	for (j=0;j<2;j++) {
		srand64();
		for (i=0;i<25;i++) printf("%04x ",rand64(64));
		printf("\n");
	}
}
#endif
