C#の乱数生成でつまづいた話

最近C#の学習中に乱数の生成でつまづいたので記事にしておく。

 

問題

ランダムな値を生成しようとすると同じ値が出力される。

使用したクラス:System.Randomクラス

 

具体的な状況

別々のインスタンスで乱数生成してみたら同じ値が出力された。

f:id:iamkaito:20190620002701p:plain

 

原因

System.Randomのコンストラクタはシード値を渡さないRandom()とシード値を渡すRandom(Int32)の二種類がある。Random()の場合にシード値として使われるSystem.Environment.TickCountがミリ秒単位のため、1ミリ秒以内に生成したRandom型は同じシード値で生成したことになり、乱数も同じものが生成されてしまう。

 

対処方法

1.公式(https://docs.microsoft.com/ja-jp/dotnet/api/system.random.-ctor?view=netframework-4.8)にある通り2秒間スリープさせる。

f:id:iamkaito:20190620004405p:plain

2.一つのRandomインスタンスを使う。

f:id:iamkaito:20190620005029p:plain

 

他にも色々ありそうですが、うまく違う値を出力することができました!

 

参考:

https://docs.microsoft.com/ja-jp/dotnet/api/system.random.-ctor?view=netframework-4.8

https://qiita.com/neko_the_shadow/items/72f0285324100a596979