簡體   English   中英

Random.Next會不會隨機停止?

[英]Will Random.Next ever stop being random?

我需要創建0到2之間的隨機數,所以我使用:

//field level
private static Random _random = new Random();

//used in a method
_random.Next(0, 2)

我的問題是:序列是否會重復/停止隨機? 我應該_random = new Random();重新創建( _random = new Random(); )嗎?

你的代碼很好。

您不需要每天創建一個新的Random對象。

請注意, Random不是真正隨機的,而是產生偽隨機結果。

如果您查看文檔中的“備注”部分您會發現System.Random是一個偽隨機生成器。

這意味着理論上序列最終會重復。 在實踐中,它在很大程度上取決於你正在做什么,這有多重要。 例如,序列的長度使得人們不會注意到它們重復。 另一方面,它對密碼學來說毫無用處。

編輯添加:每天重新啟動不會有太大的區別。 偽隨機性對您來說已足夠,或者您需要查看以加密方式生成隨機數的安全方法。

Math.Random返回一個32位有符號整數,如果你不重新調用,它將在2 ^ 32'調用時重復。 如果你重新種植它會很快重復。

隨機不是隨機的。 如果你需要“更多的”隨機的,你應該有一個看起來加密類,如RandomNumberGenerator (摘要),例如: RNGCryptoServiceProvider

如果你讀過這個,你會看到Random(當前)基於(24,55) the subtractive lagged Fibonacci generator of (24, 55)它應該保證周期至少為2 ^ 55。 但如果你看一下頁面的末尾,有人指出了一個可能的錯誤(2010年10月ytosa的評論)

http://msdn.microsoft.com/en-us/library/system.random(v=vs.100).aspx

讓我們說這段時間足夠長,除非你需要做“特殊”應用程序!

我將補充一點,Wiki http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator告訴我們,有一篇論文顯示24,55序列的滯后Fibonacci不是“足夠隨機”(在Problems with LFG下)

值得一提的是(根據我的經驗列出)如果你申報時有一個方法

 Random myRand=new Random();
 myRand.Next(10);  
 //...doing somthing with that

然后,如果你多次調用這個方法(在一個循環中),你可能會得到很多重復的結果。 (發生在我身上的事)。

我找到了解決辦法是移動Random myRand=new Random()是一成員發起statment(而不是方法的局部變量),比賽像你這樣。

之后,不再有重復的結果

如果目的是生成加密安全隨機數,您應該使用更好的PRNG。 如果你只想要偶爾的隨機數並且真正的隨機性並不重要(我想這給出了輸出值范圍)那么你的代碼很可能就好了。

暫無
暫無

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

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