2011-06-16 73 views
5

舉例來說,如果我有一個類:如何在一行中有兩個隨機數給出不同的值?

public class Class 
{ 
public Random r; 

public Class() 
{r= new Random()} 
} 

後來創建它的兩個實例:

Class a = new Class(); 
Class b = new Class(); 

,並調用順序R,同時爲R將給予相同的值。我讀過這是因爲Random的默認構造函數使用時間來提供「隨機性」,所以我想知道如何防止這種情況。提前致謝!

回答

5

實現該目的的一種方法是製作rstatic

static意味着只有一個Random r將存在,它將在該類的所有實例中共享。

你的代碼應該是這樣的:

public class Class() { static Random r = new Random(); } 

Class a = new Class(); 
Class b = new Class(); 

如果你使用線程,你可以把它[ThreadStatic](這樣每個線程使用自己的Random類的實例)

有信息關於如何使用[ThreadStatic]here - 我自己並沒有使用它,但它看起來很酷且漂亮,並且擺脫了任何潛在的線程相關的困境。

4

隨機類的構造函數是基於時間的。所以當你以快速的順序創建它們時 - 它們會得到相同的種子,然後會產生相同的值。

所以你需要分享你的課程的隨機- 或 -你自己提供一個不同的初始種子。

2

在這種情況下的一種可能性是使Random成爲一個靜態,以便它只被實例化一次。

public class Class{ 
    private static Random r = new Random();   
    //the rest of your class 
} 

的問題是,您所創建的兩個類幾乎在同一時間,因此他們將使用相同的種子(因爲它是基於中其他事物的當前時間),並會產生相同的數字序列。

1

試試這個:

public class TestClass 
{ 
    private static int seed = Environment.TickCount; 


    public TestClass() 
    { 
     DoStuff(); 
     DoStuff(); 
     DoStuff(); 
     DoStuff(); 
    } 

    private void DoStuff() 
    { 
     var random = new Random(seed++); 
     int index = random.Next(30) + 1; 

     //Console.Write(index); 
    } 
} 
相關問題