我發現這個初始化Random
實例:爲什麼初始化未經檢查的新的Random()(Environment.TickCount * 31)?
var random = new Random(unchecked(Environment.TickCount * 31));
爲什麼不乾脆用new Random()
?
我發現這個初始化Random
實例:爲什麼初始化未經檢查的新的Random()(Environment.TickCount * 31)?
var random = new Random(unchecked(Environment.TickCount * 31));
爲什麼不乾脆用new Random()
?
關鍵字unchecked
可防止在計算Environment.TickCount * 31
整數溢出時引發異常。
由此產生的計算本質上是一個隨機整數(它拋棄了一堆高階位),它用於種子隨機數發生器。
注意,Reference Source for Random有這個代碼作爲其參數的構造函數:
public Random()
: this(Environment.TickCount) {
}
爲什麼是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 –
我不知道。這可能是一個錯誤。 [Lehmer Random Number Generator](https://en.wikipedia.org/wiki/Lehmer_random_number_generator)使用2 3作爲一個大的Mersenne Prime;也許這就是它的來源。 –
31 == 2^5 - 1 == 11111(二進制)。乘以這樣的數字意味着差異的擴大:即使兩個數字只有一個比特不同,這兩個數字乘以31也很可能在多個比特中有所不同。但是,爲了實現「隨機」功能,這不應該是必要的。 – mkl
'Random'與相關剔計數的一些統計問題。我認爲31應該解決這個問題。這個代碼在任何情況下都會被打破,因爲它依賴於ticks。一個更好的方法,不是最好的,是'new Random(NewGuid()。GetHashCode())'。 – usr
這是一個完全無用的代碼。 Random()已經基於'Environment.TickCount'初始化自己,並且默認情況下C#未被選中。我真的很想知道添加'* 31'是做什麼的。 – CodeCaster