Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9360

【C#】偏りが少ないランダムな数字を出力するプログラム

$
0
0

はじめに

作ったプログラムをテストする際に何かとランダムデータが必要になってくる。
しかし、備え付けのライブラリでランダムデータを作っても偏りが酷くて困ってしまう。
どうにかして偏りが少ないランダムデータを作ることはできないものか…ということで、C#でランダムデータ生成プログラムを作成してみた。

サンプルプログラム

Sample.cs
usingSystem;usingSystem.IO;classSample{publicstaticvoidGenerateRandomData(){stringDataPath=@"C:\Folder\RandomData.csv";Console.WriteLine("データを生成します。");FileStreamfs=System.IO.File.Create(DataPath);fs.Close();using(StreamWritersw=newStreamWriter(DataPath)){intRoopCount=0;//TickCountで取得した、コンピュータを起動してからの経過時間をミリ秒単位で取得し、ランダムデータ生成のSeed値とするintSeed=Environment.TickCount;Randomrnd=newRandom();//ランダムデータ生成件数intMaxRoop=100;while(true){//ループカウントが生成件数の設定値に到達したらループ終了if(RoopCount>=MaxRoop){break;}//普通のランダムクラスのインスタンスを生成RandomSeedRoopCountRondom1=newRandom();//上限値を適当に設定し、数値をひとつ取り出すintSeedRoopCount1=SeedRoopCountRondom1.Next(200);//上限値の分だけループfor(inti=0;i<200;i++){//ランダムクラス「rnd」にSeed値をインクリメントしたものを与えてインスタンス生成//ここでループを繰り返してSeed値を与えることで、よりランダム性のある数値を作ることができるrnd=newRandom(Seed++);//普通のランダムクラスから取得した値とループカウントが同じになればループ終了if(i==SeedRoopCount1){break;}}//ランダムデータとして取り出したい範囲の値を設定intvalue=rnd.Next(1,100000);//51ミリ秒待つのがポイント(根拠は正直あまりない…)//ここで待機時間を入れないとマシンの性能によってはSeed値に規則性が生まれてしまい、ランダムデータが規則的な間隔で出力されるためSystem.Threading.Thread.Sleep(51);//csvにデータを書き込みするsw.WriteLine(value);RoopCount++;}Console.WriteLine("データ出力完了");Console.ReadKey();}}}

出力されたcsvのデータを分布図にまとめてみると、こんな感じになる。
Sample
イイ感じではないだろうか?


Viewing all articles
Browse latest Browse all 9360

Latest Images

Trending Articles