对于某些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都使用相同的时间种子创建,因此得到相同的结果?
答案 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>
你可以做以下几件事之一:
System.Security
命名空间