●ここのサンプルで学べること。
・クラスの基本事項 足りないことがありますが・・・
・デフォルトコンストラクタとコピーコンストラクタの使い方
・operator=の代入演算子ってなに?
・explicitの使い方。引数1つのコンストラクタとかにつかうんだよw
・メルセンヌツイスタ擬似乱数発生の使い方
・
Mersenne Twister Home Page ここが本家のURLです。
・#if等のコンパイルスイッチ
・VC6.0のサフィックスとか・・・
●ビルド環境
VC6.0 SP6
QT4.3.4のMinGW付属のGCC
VC側では実行しまくってテストしましたがQT側ではテストしていません。
ビルドの確認のみです。
●概要
cMTRandは、メルセンヌツイスタを利用した擬似乱数発生クラスです。
乱数テーブルを作成しXORを利用して乱数を生成します。
operator=による代入とコピーコンストラクタを実装しているので
関数で値渡し BOOL BonyuKure(cMTRand cSrc){};等を実行する事ができます。
●メンバの説明
・cMTRand();
デフォルトコンストラクタ 内部変数の初期化のみ。
・cMTRand(int uiSeed);
なぜか、uiでunsignedのしるしついてる・・・
種を使ってデフォルトの乱数テーブルを作成します。
・cMTRand(const cMTRand &cSrc);
コピーコンストラクタ。
cMTRand A;
cMTRand B = A;
とかやったり、BOOL BonyuKure(cMTRand cSrc){};を作って
BonyuKure(A);をやれば呼ばれます。
・virtual ~cMTRand();
デストラクタ
バーチャルなので派生させてもくるはず。
class Hage : public cMTRandとかやったら
ハゲコンストラクタの前によばれ
ハゲデストラクタの後に乱数(cMTRand)のデストラクタが呼ばれる。
メモリ削除します。
・Initialize()
初期化。全部0にする。つまり、メモリを確保した後に呼べば
消せないメモリがつくれます。
privateにすべきもの。
・void Substitution(const cMTRand &cSrc)
引数の乱数クラスをコピーする
・ void InitSeed(unsigned int uiSeed, int iTblSize );
乱数の種と乱数テーブルのサイズを指定して乱数作成。
srand();と同じ物だとおもってください。
・InitArray
int iTblSize = DEFAULT_TABLESIZE, // 擬似乱数の配列サイズ
unsigned int *pKeyTbl = NULL, // 乱数生成のキーテーブル
unsigned int iKeyLength = 4 // キーテーブルの長さ
);
乱数の種を配列にして複雑なものを作りたいとき用。
InitSeedの強化版。多分、ゲームとして複雑にしたい場合はこっち。
今のゲーム機はCPU早いから複雑でもいいよね。
・取得関連
MT_UINT64 GetInt64(); // int(64bit)型で乱数を取得するが32bitでは無能。
unsigned int GetInt32(); // int(32bit)型で乱数を取得する
unsigned short GetInt16(); // short(16bit)型で乱数を取得する
float GetFloat(); // float(32bit)型で乱数を取得する
double GetDouble(); // dobule(64bit)型で乱数を取得する
それぞれの方に合わせた乱数取得。
初期化をしなくても取得時に初期化されていないことを判別してますので
生成時にいきなり使ってもOKですよ。
あと、MT_UINT64って何?
typedefした64BITの変数名にしてます。
コンパイラによっては、long longが使えて64BITだったり。
プレステ2みたいにlongで64Bitだったり色々あるじゃない。
VC6.0のように_int64で64Bit対応場合もある。
とりあえず、クラスのヘッダで#ifとかで条件コンパイルしてます。
VC6.0とそれ以外でわけてある。
PS2で使いたければその部分書き換えてください。
たぶんPSPでもいけるはず。
詳細はソースコードをダウンロードして実際に見てください。
cMTRand.hに入ってます。
仕事を終えた後に作ってるので間違ってたりする個所があるはずです。
できれば、コメントに指摘を入れてくれるとありがたいです。
サンプルコード
cmtrand.zip
ダウンロード(zip)