我有这样的代码: 字符串文本中有一些{AVATAR}
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)];
}
但在更换后我从头像中收到2个相同的字符串。为什么呢?
答案 0 :(得分:10)
这可能是因为DateTime.Now.Millisecond
在调用之间没有变化,因此同一种子被用于随机数生成器两次。
您应该将Random对象设为一个字段并仅将其初始化一次,然后在rand_avatars()
中重复使用。
或者,在进行替换之前将其初始化为本地一次,并将其传递给rand_avatars(Random random)
(已将Random作为参数添加到rand_avatars()
)。
答案 1 :(得分: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
将不会替换任何内容。