2010-03-18 134 views
2

我使用Google找到此代碼。在C#中生成真正的隨機數字很簡單嗎?

private int RandomNumber(int min, int max) 
{ 
Random random = new Random(); 
return random.Next(min, max); 
} 

這真的是所有有生成真正的隨機數在C#?我打算在值1-10之間產生一個小規模。

感謝

+3

你是什麼意思'REAL'隨機數字? C#的RNG(以及大多數語言的RNG)在設計/標準上是一個_pseudo_ RNG,但是通過給它提供相對隨機的種子(從一天中的時鐘開始),它會生成真正新穎的系列,並且[幾乎]統一分配 – mjv 2010-03-18 00:47:44

回答

1

你不必讓自己的類封裝了已有的「隨機」類。你可以叫:

int myNumber = (new Random()).Next(1, 10); 

此外,關於「真正的隨機數」 ......這是隨機足夠的需求,99.99%赫然出現在世界各地。

+0

這是隨機的,因爲它得到了......我記得在經典的ASP日子裏,你需要爵士了一下嗎? – 2010-03-18 00:43:42

+0

我知道一些隨機類在幾種語言中返回一個介於0和1之間的數字,但 – 2010-03-18 00:44:53

+0

是的,我曾經使用「關鍵字」RANDOMIZE ...當我從VB切換到VB.NET,然後切換到C#,我嚇壞了不知道在哪裏把代碼:) – 2010-03-18 00:45:27

11

你是什麼意思的「真實」?他們是隨機數字,當然,雖然可能不是加密保護隨機數字。但對於大多數應用來說,Random.Next絕對夠用。

如果您想要加密安全的隨機數,請檢查System.Security.Cryptography.RandomNumberGenerator類。

7

如果您打算使用Random類(這對大多數情況來說都沒問題),您不想爲每個調用創建一個新的隨機對象。我建議製作一個包含類的靜態成員:

private static Random random = new Random(); 
private int RandomNumber(int min, int max) 
{ 
    return random.Next(min, max); 
} 

這是因爲,默認情況下,Random類使用系統時間。

MSDN:然而,由於時鐘具有有限的分辨率,使用參數構造緊密相繼創建產生的隨機數相同的序列隨機數生成器來創建不同的隨機的對象。 Link

對於更「真實」的隨機數,您可以使用RNGCryptoServiceProvider(由Dean Harding提及)。

+2

當創建Random的多個實例時,對於與系統時鐘接近相同的播種點的+1是近似連續的。 – razlebe 2010-03-18 01:08:00