【ソフトウェア開発】一様乱数から正規乱数を作る


先月の日経ソフトウェアに載っていた一様乱数から正規乱数を作る方法が良かったのでメモメモ。

記事では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の「分析ツール」 ⇒ 「ヒストグラム」で処理すると以下のようなグラフになり、正規分布になっていることが分かります。

Histogram

計算処理が少しかかるので、リアルタイム性を求めるものには不向きだと思いますが、例えばシミュレーションRPGなどのゲームのダメージ計算に用いると面白いかもしれませんね。
マイナス値でダメージ減少、プラス値でダメージ増加。普段は中央付近の値しか出ないので基本値+-0に近い値になるとか。


この記事をシェアする

    Mask_Siva

    北の試される大地に生息しているSEです。
    楽しみながらプログラムを作ったり、ゲームで遊んだりしています。

    コメントをお待ちしております

    HTMLタグは利用できません

    Advertising



    新品/中古ゲーム販売 通販ショップの駿河屋

    Twitter

    仮面被り過ぎ@コンプレックス大佐
    @Mask_Siva

    • 甥っ子には強力な家庭教師の先生(ガンダム史)がついてくださることになりました!(笑 高等部教育まで進んだらお願いします! https://t.co/0GgcmpBOw9
      about 12分 ago
    • ちなみに、弊社事務所で飾っている某所でいただいたレッドフレームの超お高いプラモをくれと要求してくるレベルです(笑
      about 16分 ago
    • 甥っ子へのガンダム英才教育を昨日から始めました。 第一弾として某所でもらったザクヘッドを2個プレゼントし、昨日は第二弾としてEGのガンダムを事務所で一緒に組みました。 結果、甥っ子の中では、 シャアザク > ガンダム > 仮面ライ… https://t.co/oikjy3sZK1
      about 18分 ago

    BGM

    シドニア - EP
    1 シドニア -angela

    ↓の再生ボタンで再生できます
    色々な楽曲を試聴したいなら
    >>>こちら<<<

    Nico Nico Community

    Calendar

    2022年5月
    1234567
    891011121314
    15161718192021
    22232425262728
    293031 

    Archive

    My WIsh List

    Amazonで気になっている物をまとめています。

    「これは良かった!」「こっちの方がいいよ!」というものがあれば、教えてください<(_ _)>

    https://amzn.to/3oof0rZ