兰德的问题

obd*_*dgy 2 c#

我有这样的代码:字符串文本中有一些{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()).


fer*_*ero 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)];
}
Run Code Online (Sandbox Code Playgroud)

编辑:顺便说一句,该if子句是不必要的,因为Regex.Replace如果模式不匹配,则不会替换任何内容.