先月の日経ソフトウェアに載っていた一様乱数から正規乱数を作る方法が良かったのでメモメモ。
記事ではJavaを使った作り方が書いていましたが、C#で同じようなことを行ってみました。
以下が作ったコードになります。
using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; namespace RandomTest { class Program { static void Main(string[] args) { // 起動時間をシード値として利用する(インクリメントしているのはお約束だから) int seed = Environment.TickCount; System.Random r = new System.Random(seed++); //Excelで分析しやすいようにCSVファイルとして出力する StreamWriter writer = new StreamWriter("result.csv"); for (int i = 0; i < 1000000; i++) { writer.WriteLine(randomGaussian(r).ToString()); } } public static double randomGaussian(Random r) { double avg = 0; for (int i = 0; i < 10; i++) { // 0~9の乱数を加算する avg += r.Next(10); } avg -= 45; return avg; } } }
この結果をExcelの「分析ツール」 ⇒ 「ヒストグラム」で処理すると以下のようなグラフになり、正規分布になっていることが分かります。
計算処理が少しかかるので、リアルタイム性を求めるものには不向きだと思いますが、例えばシミュレーションRPGなどのゲームのダメージ計算に用いると面白いかもしれませんね。
マイナス値でダメージ減少、プラス値でダメージ増加。普段は中央付近の値しか出ないので基本値+-0に近い値になるとか。
コメント