2013-03-20 137 views
0

对于某些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; 
       } 
     } 
    } 

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

在我的“随机”方法的某个地方出现断点时,我得到了不同的“更随机的” 结果。

这里发生了什么?

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

这是一些优化,所以我所有的Randoms都是用相同的时间种子创建的,因此得到相同的结果?

+0

原来如此。在 – 2013-03-20 20:03:14

回答

1

您每次调用正在使用相同值(基于当前时间)播种的方法时,都会创建一个新的随机对象,以便继续获得相同的随机值。

而是执行此操作:

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 
} 
+0

之前没有找到答案帮我解决。谢谢! – 2013-03-20 20:07:17

0

我会假设你在一个紧凑的循环非常频繁调用这个(即,小到电话之间没有时间)

的默认构造函数用于Random看起来是这样的:

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

请参阅Environment.TickCount?如果您非常快速地尝试新建多个Random实例(即,在该计数器更改之前),您将有效地获得完全相同的随机数序列 - 因此“PseudoRandom”。

你可以做的几件事情之一:

  • 等待的呼叫之间,而
  • 在种子手动传递到构造函数
  • 使用的PRNG在System.Security命名空间
+0

非常感谢!这就是问题......通过外部随机实例解决它 – 2013-03-20 20:08:03