#author("2024-02-14T20:23:48+09:00;2023-05-24T00:47:13+09:00","","")
#author("2024-02-14T20:25:10+09:00;2023-05-24T00:47:13+09:00","","")
* ランダム関数 [#a006e76e]
本格的なゲームを作るにはランダム関数(乱数)が必要不可欠です。乱数といっても大まかに3種類に分類されていると思って構わないと思います。使い分けをすることによってゲーム全体の裏ハッタリ度がアップすることを願っています。

** 1.完全な乱数 [#y574dbb5]
- 使用目的~
言わずもがな、全く予測不能、乱数らしい乱数です。あらゆるギャンブル、あらゆる確率など。gccに使われるrand関数は精度がよくなく、インターネットで調べてみるとMT法が良いとされています。

- 生成方法
-- 内蔵時計や(キー入力等でずらした)タイマーカウンタを見て、それを初期値とする。
-- あとはキー入力待ちなどのループが起こるたびに、一定の計算法で乱数を生成。

** 2.完全パターンの擬似乱数 [#b1c6210c]
- 使用目的~
厳密に言うと乱数ではありませんが、同じアルゴリズムで生成されたものです。ザコを無造作に出したい。でも毎回パターンが違うと困る、というときに重宝します。ザコ敵の出現位置パターンなど。

- 生成方法
-- 初期値は完全に固定とする。
-- あとは乱数を必要とするたびに一定の計算法で乱数を生成。

** 3.初期設定のみ乱数で、あとは擬似乱数(一定パターン乱数) [#oe379dd1]
- 使用目的~
一番分かりにくいのがこれです。しかし重要度は一番だと思います。1と2の複合型です。ある程度運の要素が絡むゲームにおけるリプレイ機能の再現、パスワードの生成・解読。

- 生成方法
-- 内蔵時計やタイマーカウンタを見て、それを初期値とする。ただしこの値はどこかに保存しておく。
-- あとは乱数を必要とするたびに一定の計算法で乱数を生成。
-- リプレイ時に、保存していた値を初期値として再設定する。

** MT法 [#ref549f0]
[[メルセンヌ・ツイスタ法:https://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html]]の使用方法を以下に表します。基本的に中身には一切ふれず、関数の呼び出し名、引数の変更をしました。使用するときはライセンスの確認を怠らないでください。シード値はデフォルトで使用されている5489UL、テストの内容は0x0~0xfまでの値をひたすら生成してカウントアップさせています。
[[メルセンヌ・ツイスタ法:http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html]]の使用方法を以下に表します。基本的に中身には一切ふれず、関数の呼び出し名、引数の変更をしました。使用するときはライセンスの確認を怠らないでください。シード値はデフォルトで使用されている5489UL、テストの内容は0x0~0xfまでの値をひたすら生成してカウントアップさせています。

 int main(void)
 {
 	REG_WSCNT = 0x4317;
 
 	BgInit();
 	IrqInit();
 	RndInit(5489UL);
 	KeyInit();
 
 
 	char str[32];
 
 	u32 num[0x10];
 	_Memset(&num, 0x00, sizeof(num));
 
 	for(;;)
 	{
 //		VBlankIntrWait();
 		KeyExec();
 
 		// Stop
 		if(KeyGetCnt() & KEY_A)
 		{
 			continue;
 		}
 
 		num[RndU32() & 0xf]++;
 
 		for(s32 i=0; i<0x10; i++)
 		{
 			_Sprintf(str, "0x%x:%d", i, num[i]);
 			BgAsciiDrawStr(0, i, str);
 		}
 	}
 }

** 動作画面 [#j0dfebe4]
#ref(1.png,nolink)

とてもバランス良い結果が出力されていると思います。

** 参考リンク [#x4e8f7d5]
-[[良い乱数・悪い乱数:https://isaku-wada.my.coocan.jp/rand/rand.html]]
-[[良い乱数・悪い乱数:http://isaku-wada.my.coocan.jp/rand/rand.html]]

** 出典元 [#bf2c0deb]
- M-KAIさんの「Witchシューティングゲーム制作記帳」

** 履歴 [#k5f8c172]
- 2023/04/18
- 2008/06/30

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS