我有这样的代码:字符串文本中有一些{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)];
}
Run Code Online (Sandbox Code Playgroud)
但在更换后我从头像中收到2个相同的字符串.为什么?
Mat*_*son 10
这可能是因为DateTime.Now.Millisecond调用之间没有变化,因此同一种子被用于随机数生成器两次.
您应该将Random对象设为一个字段并仅将其初始化一次,然后重新使用它rand_avatars().
或者,在执行替换之前将其初始化为本地一次,并将其传递给rand_avatars(Random random)(已将Random添加为参数rand_avatars()).
使用相同的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)];
}
Run Code Online (Sandbox Code Playgroud)
编辑:顺便说一句,该if子句是不必要的,因为Regex.Replace如果模式不匹配,则不会替换任何内容.