C++ 乱数(MT法)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
エンタープライズ(FF4)

C++ 乱数(MT法)

#1

投稿記事 by エンタープライズ(FF4) » 7年前

乱数生成のMT法の使い方(?)がわからず質問させていただきました。

(?)がついているのも、わかっていることが少なすぎるため見当違いな聞き方しているかもしれないからです。

ずいぶん前に買ったダンジョンゲームの本に載っており、その正確性から是非取り入れたいと考えています。

コード:

#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もよくわからず関数を作ったのですが何のタイムなのか…

lunnear
記事: 10
登録日時: 7年前

Re: C++ 乱数(MT法)

#2

投稿記事 by lunnear » 7年前

回答になっているか分かりませんが
std::mt19937
というMTによる疑似乱数生成がC11から標準で実装されています。
そちらを使ってみてはどうですか。

エンタープライズ(FF4)

Re: C++ 乱数(MT法)

#3

投稿記事 by エンタープライズ(FF4) » 7年前

こんな便利なものが…!

感謝です

返信

“C言語何でも質問掲示板” へ戻る