(?)がついているのも、わかっていることが少なすぎるため見当違いな聞き方しているかもしれないからです。
ずいぶん前に買ったダンジョンゲームの本に載っており、その正確性から是非取り入れたいと考えています。
#pragma once
#include"Define.h"
class Random {
public:
/*////////
メンバ変数
*/////////
int bet;
int mti;
int mt[1];
unsigned long y;
static unsigned long mag01[2] = { 0x0UL, MATRIX_A };
/*////////
メンバ関数
*/////////
//コンストラクタ
Random();
//デストラクタ
~Random();
int Dungeon_Random(int bet);
void Time();
void Dungeon_Random_Init();
};
#include"Random.h"
Random::Random() {
}
Random::~Random() {
}
int Random::Dungeon_Random(int set_bet) {
if (bet = 0) {
return 0;
}
if (mti >= N) {
int kk;
if (mti == N + 1) {
Dungeon_Random_Init();
}
for (kk = 0; kk < N - M; ++kk) {
y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
}
for (; kk < N - 1; ++kk) {
y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
}
y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL];
mti = 0;
}
y = mt[++mti];
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL;
y ^= (y >> 18);
//引数が負数ならマイナスbetを超える~0にする
if (bet < 0) {
bet = -bet;
return -(int)(y % bet);
}
return y % bet;
}
void Random::Dungeon_Random_Init() {
unsigned long s = (unsigned long)Time(NULL);
//s = 1195117558
mt[0] = s & 0xffffffffUL;
for (mti = 1; mti < N; ++mti) {
mt[mti] = (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
mt[mti] &= 0xfffffffUL;
}
}
Timeもよくわからず関数を作ったのですが何のタイムなのか…