2016-07-21 43 views
4

我發現這個初始化Random實例:爲什麼初始化未經檢查的新的Random()(Environment.TickCount * 31)?

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

爲什麼不乾脆用new Random()

+2

'Random'與相關剔計數的一些統計問題。我認爲31應該解決這個問題。這個代碼在任何情況下都會被打破,因爲它依賴於ticks。一個更好的方法,不是最好的,是'new Random(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 Random Number Generator](https://en.wikipedia.org/wiki/Lehmer_random_number_generator)使用2 3作爲一個大的Mersenne Prime;也許這就是它的來源。 –

+0

31 == 2^5 - 1 == 11111(二進制)。乘以這樣的數字意味着差異的擴大:即使兩個數字只有一個比特不同,這兩個數字乘以31也很可能在多個比特中有所不同。但是,爲了實現「隨機」功能,這不應該是必要的。 – mkl

相關問題