[英]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
不是真正隨機的,而是產生偽隨機結果。
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.