C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

.NetのRandomクラスから出力される値のムラについて

さんざんゲームを作り、システムを作ってきたはずなのに、
こんな基本的な落とし穴にはまってしまったのでメモ。


Randomクラスなのに使い方次第では完全なRandomにならない

Seedを揃えればそうなるのは仕様だけれど、
意図せずにこんな事があるとは、恐ろしい・・・


まず、Randomをインスタンスする際コンストラクタ引数なしの場合
SeedがEnvironment.TickCountを使用する設定になっている。

よって、連続して複数のインスタンスをほぼ同時に行うと、 同じ結果しか吐き出さなくなる。
というのはここらへんを見ると解ると思う


しかしながら、上記の対応方法でも問題がある。
Seedの値がいくらか違っても、どういうわけか結果に顕著なムラがある。

元々ムラがあるのは内部的に採用しているアルゴリズム上、仕方ないのだが、
それ以上に結果のムラを強く感じる。

検証ソース


結果


このレベルのムラはゲームでは致命的にはならないが、
GAなどでは結果に大きく影響するため、意識的に避けたい。

そういうわけで、複数のインスタンスを作成するより、
ひとつのインスタンスを使いまわす方が結果が優秀であるため、
スタティックでグローバルなクラスを作って、 そこから取得するのが良いのではないかと思う。


以下適当ソース


取得方法


結果サンプル


なんか、ジェネリックとかで、他にもっとうまい方法で出来るような気がするんだけど、
とりあえずこんな感じで。

求ム、最適解。


2012/11/22 追記
RandomをRondomと何度も何度も連呼しているという、
ソーシャルなウィンドーが全開の、まっこと恥ずかしい誤記を指摘していただいた、
通りすがりのご親切な方、誠に誠にありがとうございました。
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/157-25451d1b

« AndroidでUnityのInput.gyroを使う方法  | HOME |  FXAAをXNA4.0で使う »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2017-12 | »
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約