2012-05-24 151 views
2

可能重複:
Random number generator not working the way I had planned (C#)C#隨機函數返回同一值

我已經做了簡單的常規,其生成隨機數

private int randomNumber() 
{ 
    Random random = new Random(); 
    int randomNum = random.Next(0, 100); 
    Response.Write(randomNum); 
    return randomNum; 
} 

我把這種在整個我的page_load在兩個不同的階段以相同的方式:

// A/B Test 
if (randomNumber() <= 50) 
{ 
... 

雖然我發現兩個數字總是相同的。有任何想法嗎?

+0

在開始使用來自多個線程的單個隨機實例之前,請閱讀http://csharpindepth.com/Articles/Chapter12/Random.aspx –

+0

我多次調用該函數,但每次都給出不同的輸出。 –

回答

11

當您創建一個Random實例時,它會播種當前時間。所以如果你同時創建了它們中的幾個,它們將生成相同的隨機數字序列。您需要創建一個Random的實例並使用它。

+0

好吧,無論是每個線程的單個實例,還是帶鎖定的單個實例... –

7

new Random()以當前時間初始化爲種子。如果你打電話足夠快,那麼種子將會和Next()呼叫的結果一樣。

2

Random

初始化隨機類的新實例,使用 時間相關的默認種子值。

來自MSDN。

默認種子值來自系統時鐘,並具有有限的 分辨率。因此,通過調用默認構造函數在 中創建的不同Random對象將具有相同的默認種子值,因此將產生相同的 組隨機數。通過使用一個單獨的隨機對象來生成所有隨機數,可以避免此問題。您還可以通過修改系統時鐘返回的種子值,然後 明確地向隨機(Int32) 構造函數提供此種子值來解決 。有關更多信息,請參閱Random(Int32)構造函數。

1

您可以通過在你的類具有隨機的單個實例解決這個問題,並重新使用它產生的隨機數

public class TestPage : Page 
{ 
    private Random Generator {get;set;} 
    public Test() 
    { 
     this.Generator = new Random(); 
    } 
    private int randomNumber() 
    { 
     return this.Generator.Next(0, 100); 
    } 
} 

這將創建一個Random類爲每個請求。如果您希望將它放在一組用戶中,您可以將生成邏輯封裝在Singleton中,並在所有用戶中共享相同的實例。