如何获得良好的随机结果

时间:2013-03-20 20:00:18

标签: c# wpf random

对于某些TreeView,我想测试项目背景属性的大量值。

所以我现在有一棵树,里面装满了200件物品。

这些是可能的值:

public enum EnumItemState
{ 
    Default,
    Red,
    Green,
    Yellow,
}

现在我想在视图中快速测试不同的值,所以我写道 这段代码:

    private EnumItemState GetRandomItemState()
    {

        var rand = new Random();

        var val = rand.Next(0, 3);

        switch (val)
        {
            case 0:
                {
                    return EnumItemState.Red;
                }
            case 1:
                {
                    return EnumItemState.Green;
                }
            case 2:
                {
                    return EnumItemState.Yellow;
                }
            default:
                {
                    return EnumItemState.Default;
                }
        }
    }

但它根本不是随意的。一次运行的所有值都相同。

在我的“随机”方法的某处有断点,我变得与众不同,“更随机” 结果

这里发生了什么?

如何获得更好的随机结果?

是否进行了一些优化,所以我的所有Random都使用相同的时间种子创建,因此得到相同的结果?

2 个答案:

答案 0 :(得分:1)

每次调用方法时都会创建一个新的Random对象,该方法使用相同的值(基于当前时间)播种,因此您可以获得相同的随机值。

请改为:

void CallingMethod()
{
    Random rnd = new Random();

    for (int i = 0;i < 200;++i)
        EnumItemState state = GetRandomItemState(rnd);
}

private EnumItemState GetRandomItemState(Random rnd)
{
    // Same code you had here, but don't create new instance of Random
}

答案 1 :(得分:0)

我会假设你在一个紧凑的循环中频繁地调用它(即在呼叫之间几乎没有时间)

Random的默认ctor如下所示:

public Random() : this(Environment.TickCount)
{
}

看到Environment.TickCount?如果您非常快速地尝试新的多个Random实例(即,在该滴答计数发生变化之前),您将有效地获得完全相同的随机数序列 - 因此“PseudoRandom”。< / p>

你可以做以下几件事之一:

  • 在两次通话之间等待一段时间
  • 手动将种子传递给ctor
  • 使用System.Security命名空间
  • 中的prng