2013-05-22 40 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不会取代任何东西。