簡體   English   中英

System.Random rnd = new System.Random() 有多隨機;

[英]How random is System.Random rnd = new System.Random();

我有一些運行的代碼。 在我執行的循環內:

System.Random rnd = new System.Random();

如果運行呼叫之間幾乎沒有時間延遲,我可以期望這個數字是隨機的嗎?

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

只要你這樣做,無論時間延遲如何,它都是隨機的。

文檔中:

從一組有限的數字中以相等的概率選擇偽隨機數。 選擇的數字不是完全隨機的,因為對它們使用了明確的數學算法,但它們對於實際目的來說是足夠隨機的。 Random class 的當前實現基於 Donald E. Knuth 的減法隨機數生成器算法的修改版本。 有關詳細信息,請參閱 DE Knuth。 “計算機編程的藝術,第 2 卷:半數值算法”。 Addison-Wesley,馬薩諸塞州雷丁,第二版,1981 年。

不考慮生成兩個隨機數之間的延遲。 當然,這指的是在同一個實例上調用Random.Next ,而不是像您的代碼那樣每次都創建一個新的Random實例(這是錯誤的):

這個問題可以通過創建單個隨機 object 而不是多個來避免。

為了提高性能,創建一個 Random object 以隨着時間的推移生成許多隨機數,而不是重復創建一個新的 Random 對象以生成一個隨機數。

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

例如,要生成適合創建隨機密碼的加密安全隨機數,請使用派生自 System.Security.Cryptography.RandomNumberGenerator(例如 System.Security.Cryptography.RNGCryptoServiceProvider)的 class。

不,您幾乎肯定會兩次獲得相同的數字。 您想對整個序列使用Random的單個實例...只要您在一個線程中完成所有操作。

不幸的是Random有這個問題並且不是線程安全的 - 所以讓單個 static 變量初始化一次的簡單方法不起作用:(

有幾種方法可以解決這個問題,包括為每個線程創建一個實例。

我有一篇更詳細的文章,您可能會覺得有幫助。

為什么不將該行移到循環外,只在循環內調用Next()方法?

不,因為調用 new System.Random(); 沒有參數將使用系統時鍾作為種子,因此可以在循環中獲得相同的隨機數。

您應該在循環外創建 new System.Random() object 並在循環內獲取下一個隨機數。

rnd.Next();

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

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

一些基本解釋:計算機無法生成“真實”隨機數。 訣竅是采用一些獨特的種子,通常是較大的 integer 數字,而不是使用特殊算法使該種子成為所需范圍內的數字。 每次調用相同的種子時,都會產生相同的“隨機”數字序列。

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

您需要隨機數還是偽隨機數? System.Security.Cryptography.RandomNumberGenerator 呢?

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx

是的,它會給出隨機值,我認為這與呼叫之間是否存在延遲無關。 在循環外聲明並初始化隨機變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM