2013-05-22 63 views
2

問題我有這樣的代碼: 字符串文本中有與蘭德

if (text.Contains("{AVATAR}")) 
     text = Regex.Replace(text, "{AVATAR}", m => rand_avatars()); 
public string rand_avatars() 
{ 
    string[] text = avatars.ToArray(); 
    Random rand = new Random(DateTime.Now.Millisecond); 
    return text[rand.Next(text.Length)]; 
} 

一些{} AVATAR但替換出來後我收到來自頭像2個相同的字符串。爲什麼?

+0

我有類似的問題:http://stackoverflow.com/questions/15162048/very-irdird-code-with-random-works-different-when-i-use-breakpoint – Kamil

回答

10

這可能是因爲DateTime.Now.Millisecond沒有在調用之間改變,因此相同的種子被隨機數發生器使用兩次。

應進行隨機對象的字段並初始化它只有一次,然後在rand_avatars()重新使用它。

或者,在進行替換之前將其初始化爲一次,然後將其傳遞給rand_avatars(Random random)(將Random作爲參數添加到rand_avatars())。

+0

@IlyaIvanov不,它是'環境。 TickCount'被用作默認種子。 –

+0

@MatthewWatson是的,謝謝你,只是後反編譯'Random'看到 –

5

使用相同Random對象並調用Next每次。如果您爲每個號碼創建一個新的Random對象,你會得到類似的結果。

private Random _r = new Random(); 

void Foo() 
{ 
    /// ... 

    if (text.Contains("{AVATAR}")) 
     text = Regex.Replace(text, "{AVATAR}", m => rand_avatars()); 

    /// ... 
} 

string rand_avatars() 
{ 
    string[] text = avatars.ToArray(); 
    return text[_r.Next(text.Length)]; 
} 

編輯:順便說一句,在if子句是不必要的,因爲如果模式不匹配Regex.Replace不會取代任何東西。