我有一些運行的代碼。在循環中的我執行:System.Random rnd = new System.Random();
System.Random rnd = new System.Random();
我可以期待的數量是隨機的,如果有運行的呼叫之間幾乎沒有時間延遲?
我有一些運行的代碼。在循環中的我執行:System.Random rnd = new System.Random();
System.Random rnd = new System.Random();
我可以期待的數量是隨機的,如果有運行的呼叫之間幾乎沒有時間延遲?
每次你想要一個隨機數時,你都不應該創建一個新的Random實例。您應該創建一次,然後使用Next ...方法。
提供你這樣做,它會隨機的,無論時間延遲。
它不會隨機,因爲您將使用相同的種子。
在循環的外部只有一行,並在每次迭代中使用相同的rnd
實例,調用其Next
方法。
一些基本的解釋:電腦無法生成「真實」的隨機數。訣竅是採用一些獨特的種子,通常是大整數,而不是使用特殊算法將種子編號到所需範圍內。每次調用時,相同的種子將產生相同的「隨機」數字序列。
據我所知,C#使用的默認種子是自1970年1月1日以來傳遞的毫秒數。
爲什麼不把該行移動到循環外部,只在循環內部調用Next()
方法?
是的,它會給隨機值,我不認爲它有任何事情要做,無論是否存在呼叫之間的延遲。聲明並初始化循環外的隨機變量。
不,你幾乎肯定會得到相同的數字兩次。你想爲整個序列使用單個實例Random
......只要你在一個線程中做所有事情。
這是不幸的Random
有這個問題和是不是線程安全的 - 所以有初始化一次一個靜態變量的簡單的方法行不通:(
有幾個方法來解決這包括創建每個線程的實例
我有一個article它進入了很多更詳細的,這對您有幫助
沒有因爲新System.Random()的調用;不帶參數會使用系統時鐘一個種子,因此可以在循環中獲得相同的隨機數。
您應該在循環外部創建新的System.Random()對象,並獲取循環內的下一個隨機數。
rnd.Next();
僞隨機數被從有限的 號碼選擇了與 相等的概率。所選擇的數字不是 完全隨機的,因爲使用數學算法確定 選擇它們,但是它們足夠實際用於隨機選擇 。隨機數 類的當前實現基於Donald E.Knuth的減法 隨機數生成器算法的修改版本 。有關 的更多信息,請參見D. E. Knuth。 「計算機編程藝術, 第2卷:研究數學算法」。 Addison-Wesley出版社,閱讀,MA,第二 版,1981年
產生兩個隨機數不進入帳戶之間的延遲。當然,這是指在同一實例調用Random.Next
而不是每次都在你的代碼(這是錯誤的)創建一個新的Random
實例:
可避免此問題,通過 創建一個隨機對象,而 比多個。
爲了提高性能,創建一個 Random對象隨着時間的推移產生許多隨機 數字,而不是反覆 創建一個新的隨機 對象,生成一個隨機數。
如果你需要生成的加密強度的隨機性:
產生適合於創建 隨機密碼加密的安全 隨機數,例如,使用來自 系統派生的 類。 Security.Cryptography.RandomNumberGenerator 如 System.Security.Cryptography.RNGCryptoServiceProvider。
你需要隨機或僞隨機數嗎? 怎麼樣System.Security.Cryptography.RandomNumberGenerator?
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx
謝謝。但是如果我在接下來的行中使用下一個,然後再使用另一個,會怎樣它仍然是隨機的嗎? – 2011-05-04 10:24:55
@ Dave-Heart。是。 – 2011-05-04 10:31:14