2008-09-04 39 views

回答

60

我唯一加入Eric的回答是一個解釋;我覺得爲什麼代碼能夠工作的知識比知道代碼的工作更好。

解釋是這樣的:假設你想要一個介於2.5和4.5之間的數字。範圍是2.0(4.5 - 2.5)。 NextDouble只返回一個介於0和1.0之間的數字,但如果將此乘以範圍,則將得到一個介於0和之間的數字

那麼,這會給我們隨機雙打0.0和2.0之間:

rng.NextDouble() * 2.0

但是,我們希望他們在2.5和4.5之間!我們如何做到這一點?添加最小的數字,2.5:

2.5 + rng.NextDouble() * 2.0

現在,我們得到一個介於0.0和2.0之間的數字;如果你爲這些值中的每一個加2.5,我們就會發現現在的範圍在2.5到4.5之間。

起初我認爲它是重要的,如果b> a或a> b,但如果你解決這兩種方式,你會發現它的工作原理相同,只要你不弄亂變量的順序用過的。我喜歡長變量名來表達它,所以我不弄混:

double NextDouble(Random rng, double min, double max) 
{ 
    return min + (rng.NextDouble() * (max - min)); 
}
2
// generate a random number starting with 5 and less than 15 
Random r = new Random(); 
int num = r.Next(5, 15); 

雙打您可以NextDouble

+1

這實際上並不準確。 NextDouble只在0.0和1.0之間生成。 – Bloodyaugust 2011-12-16 09:09:11

20
System.Random r = new System.Random(); 

double rnd(double a, double b) 
{ 
    return a + r.NextDouble()*(b-a); 
} 
1

更換下一步如何隨機的?如果你能處理的僞隨機後來乾脆:

Random randNum = new Random(); 
randNum. NextDouble(Min, Max); 

如果你想要一個「更好」的隨機數,那麼你可能應該看看梅森倍捻機算法。很多人對你而言有already implemented it雖然

1

下面是如何獲得Cryographically安全隨機數的片段: 這將在8個字節填充一個crytographically強隨機值序列。

byte[] salt = new byte[8]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(salt); 

欲瞭解更多詳情,請參閱How Random is your Random??"

1

(上甲板洗牌一CodingHorror文章的啓發)有關爲何Longhorn中已經downmodded這麼多的交代:http://msdn.microsoft.com/en-us/magazine/cc163367.aspx查找NextDouble的實施和解釋什麼是一個隨機雙。

該鏈接也是如何使用密碼隨機數(如Sameer提到的)的實例,只有實際有用的輸出而不是比特流。