2

我有这样的代码:字符串文本中包含一些 {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 个相同的字符串。为什么?

4

2 回答 2

10

这可能是因为DateTime.Now.Millisecond在调用之间没有改变,因此相同的种子被用于随机数生成器两次。

您应该使 Random 对象成为一个字段并只初始化一次,然后在rand_avatars().

或者,在进行替换之前将其初始化为本地一次,并将其传递给rand_avatars(Random random)(已将 Random 作为参数添加到rand_avatars())。

于 2013-05-22T13:12:19.253 回答
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如果模式不匹配,则不会替换任何内容。

于 2013-05-22T13:12:57.670 回答