兰德的问题

时间:2013-05-22 13:10:46

标签: 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)];
}

但在更换后我从头像中收到2个相同的字符串。为什么呢?

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将不会替换任何内容。