【问题标题】:Problems with rand兰特的问题
【发布时间】:2013-05-22 13:10:45
【问题描述】:

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

【问题讨论】:

标签: c#


【解决方案1】:

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

您应该将 Random 对象设为一个字段并只初始化一次,然后在 rand_avatars() 中重新使用它。

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

【讨论】:

  • @IlyaIvanov 不,是Environment.TickCount,默认用作种子。
  • @MatthewWatson 是的,谢谢,反编译后才看到Random
【解决方案2】:

使用相同的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 不会替换任何内容。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多