2011-09-23 50 views
0

我有一個類,名稱爲Cleint因爲我有一個函數,我想從一個函數的不同結果做一個來自Cleint的三個實例,但結果是一樣的,這裏是我的代碼:從類中調用函數時出現問題

Programm.cs:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Cleint B = new Cleint(); 
      Cleint k = new Cleint(); 
      Cleint S = new Cleint(); 
      Console.WriteLine(B.GenerateAddress()); 
      Console.WriteLine(k.GenerateAddress()); 
      Console.WriteLine(S.GenerateAddress()); 
      Console.ReadLine(); 


     } 
    } 

和Cleint.cs:

class Cleint 
    { 
     public string GenerateAddress() 
     { 
      var parts = new List<string>(); 
      Random random = new Random(); 
      for (int i = 0; i < 4; i++) 
      { 
       int newPart = random.Next(0, 255); 
       parts.Add(newPart.ToString()); 
      } 
      string address = string.Join(".", parts); 
      p; 
      return address; 
     } 
    } 

感謝的對你有所幫助

+0

嘗試播種您的隨機 - http://xkcd.com/221/的 – stuartd

+0

可能重複[隨機數生成器不工作,我已經計劃的方式(C#)](http://stackoverflow.com/questions/767999/隨機數發生器不工作的方式我已計劃c) –

+0

你是什麼意思? –

回答

2

Random不是真的隨機 - 它是僞隨機的,默認構造函數使用當前時間作爲序列的種子。

當快速連續調用時,這次將是相同的,並且序列是相同的。

您可以使用一個靜態字段,以確保您使用的是相同的Random例如,如果你永遠只能將擁有一個線程(如Random不是線程安全的):

class Cleint 
{ 
    private static Random random = new Random(); 

    public string GenerateAddress() 
    { 
     var parts = new List<string>(); 
     for (int i = 0; i < 4; i++) 
     { 
      int newPart = random.Next(0, 255); 
      parts.Add(newPart.ToString()); 
     } 
     string address = string.Join(".", parts); 

     return address; 
    } 
} 
2

問題是你如何使用隨機數生成 - 你在每種情況下創建一個新的Random實例。

有關詳細信息,請參見my article on random numbers,但基本上應對所有呼叫使用相同的Random實例。

假設你的類不是設計爲多線程的,你可以將其更改爲要麼Client一個Random場,或在GenerateAddressRandom參數。無論哪種方式,您都需要在Main中創建一個實例,併爲所有三種情況傳遞對同一個實例的引用。

+0

是的,這是問題所在。總是實例化儘可能少的「隨機」類(總是讓它們成爲類級變量)。 – qJake

+2

@SpikeX:好吧,記住它們不是線程安全的......你不想要一個靜態字段。 –

1

當你創建一個新的隨機對象,它使用PC上的當前時間作爲其生成器的種子。如果您在快速連續創建多個隨機對象,它們將生成相同的「隨機」數字。

嘗試創建一個單獨的隨機對象並從中生成。

相關問題