2016-07-21 4 views
4

私はRandomインスタンスのこの初期化が見つかりました:新しいRandom()をチェックしないで初期化するのはなぜですか(Environment.TickCount * 31)?

var random = new Random(unchecked(Environment.TickCount * 31)); 

なぜ単にnew Random()を使用しませんの?

+2

'Random'は、関連するダニの数といくつかの統計的な問題を抱えています。私は31人がそれを修正すると考えています。このコードはティックに依存しているため、いずれの場合も破損しています。最も良い方法ではなく、新しいランダム(NewGuid()、GetHashCode()) 'があります。 – usr

+4

これはまったく役に立たないコードです。 'Random()'はすでに 'Environment.TickCount'に基づいて自身を初期化していますが、C#はデフォルトではチェックされていません。私は実際に '* 31'を追加するのはどういうことかと思っています。 – CodeCaster

答えて

7

キーワードuncheckedは、計算Environment.TickCount * 31の整数がオーバーフローすると例外がスローされないようにします。

結果の計算は基本的に乱数生成器をシードするために使用されるランダム整数(上位ビットの束を捨て去る)です。

Reference Source for Randomは、そのパラメータなしのコンストラクタとして、このコードを持っていること:

public Random() 
    : this(Environment.TickCount) { 
    } 
+0

なぜ31ですか?そのような「魔法の数」?私は多くの場所でそれを見たので。 https://github.com/natfoth/LunaSkypeBot/blob/master/LunaSkypeBot/Utillities/Extensions.cs https://stackoverflow.com/questions/273313/randomize-a-listt https://github.com /AdaptiveConsulting/ReactiveTrader/blob/master/src/Adaptive.ReactiveTrader.Shared/Extensions/ArrayExtensions.cs –

+0

私は分かりません。エラーである可能性があります。 [Lehmer乱数ジェネレータ](https://en.wikipedia.org/wiki/Lehmer_random_number_generator)は、大きなメルセンプライムとして2½を使用します。多分それはそれがどこから来たのかです。 –

+0

31 == 2^5-1 == 11111(バイナリ)。このような数値を掛け合わせることは、違いを広げることを意味します。たとえ2つの数字が1ビットだけ異なる場合でも、31を掛けた2つの数字は、おそらく複数のビットで異なる可能性があります。しかし、 'random'機能を適切に実装するためには、これは必要ではありません。 – mkl

関連する問題