2011-05-04 49 views

回答

5

每次你想要一個隨機數時,你都不應該創建一個新的Random實例。您應該創建一次,然後使用Next ...方法。

提供你這樣做,它會隨機的,無論時間延遲。

+0

謝謝。但是如果我在接下來的行中使用下一個,然後再使用另一個,會怎樣它仍然是隨機的嗎? – 2011-05-04 10:24:55

+1

@ Dave-Heart。是。 – 2011-05-04 10:31:14

1

它不會隨機,因爲您將使用相同的種子。

在循環的外部只有一行,並在每次迭代中使用相同的rnd實例,調用其Next方法。

一些基本的解釋:電腦無法生成「真實」的隨機數。訣竅是採用一些獨特的種子,通常是大整數,而不是使用特殊算法將種子編號到所需範圍內。每次調用時,相同的種子將產生相同的「隨機」數字序列。

據我所知,C#使用的默認種子是自1970年1月1日以來傳遞的毫秒數。

2

爲什麼不把該行移動到循環外部,只在循環內部調用Next()方法?

0

是的,它會給隨機值,我不認爲它有任何事情要做,無論是否存在呼叫之間的延遲。聲明並初始化循環外的隨機變量。

3

不,你幾乎肯定會得到相同的數字兩次。你想爲整個序列使用單個實例Random ......只要你在一個線程中做所有事情。

這是不幸的Random有這個問題是不是線程安全的 - 所以有初始化一次一個靜態變量的簡單的方法行不通:(

有幾個方法來解決這包括創建每個線程的實例

我有一個article它進入了很多更詳細的,這對您有幫助

2

沒有因爲新System.Random()的調用;不帶參數會使用系統時鐘一個種子,因此可以在循環中獲得相同的隨機數。

您應該在循環外部創建新的System.Random()對象,並獲取循環內的下一個隨機數。

rnd.Next(); 
5

documentation

僞隨機數被從有限的 號碼選擇了與 相等的概率。所選擇的數字不是 完全隨機的,因爲使用數學算法確定 選擇它們,但是它們足夠實際用於隨機選擇 。隨機數 類的當前實現基於Donald E.Knuth的減法 隨機數生成器算法的修改版本 。有關 的更多信息,請參見D. E. Knuth。 「計算機編程藝術, 第2卷:研究數學算法」。 Addison-Wesley出版社,閱讀,MA,第二 版,1981年

產生兩個隨機數不進入帳戶之間的延遲。當然,這是指在同一實例調用Random.Next而不是每次都在你的代碼(這是錯誤的)創建一個新的Random實例:

可避免此問題,通過 創建一個隨機對象,而 比多個。

爲了提高性能,創建一個 Random對象隨着時間的推移產生許多隨機 數字,而不是反覆 創建一個新的隨機 對象,生成一個隨機數。

如果你需要生成的加密強度的隨機性:

產生適合於創建 隨機密碼加密的安全 隨機數,例如,使用來自 系統派生的 類。 Security.Cryptography.RandomNumberGenerator 如 System.Security.Cryptography.RNGCryptoServiceProvider。

相關問題