Man*_*rot 7 c# random return-value c#-4.0
可能重复:
System.Random继续返回相同的值
我正在重构和扩展一个基于C#代理的小型模型,以帮助一些生物学教授预测疾病的传播.模拟的每一年,每个单独的代理人随机地前往附近的人口节点,可能传播疾病.我是C#的新手,但是我已经读过Random.Next的潜在问题,如果使用相同的系统时间重新初始化,则返回相同的值.为了避免这种情况,我创建了一个为每个新随机值引用的静态实例.
具体内容:
在我扩展模型的努力中,我改变了它以并行计算每个人口节点的"旅行"信息.在测试模型时,我注意到在新版本中疾病不会在第一年过去.进一步的调查将问题缩小到节点之间的旅行.第一年后,所有代理人都保持不动.我检查了负责他们旅行的功能,发现它的工作原理是创建一个附近所有节点的列表,生成一个随机数<=列表中的元素数,然后前往listOfNearbyNodes [myRandomNumber].
问题:
然后我添加了一个print语句来输出每次迭代的随机索引的值.我发现整个模型在模拟的第一年完全按预期工作,随机数生成在可接受的范围内.但是,在第一年结束并且模拟循环之后,完全相同的代码将仅返回0的"随机"索引.每个线程,每个迭代,每个节点,每个代理,始终为0.因为代理的当前节点始终是列表中的第一项代理永远不会再移动.
我认为这可能是系统时间种子错误的另一种表现,所以我尝试了三种不同的方法来实现静态随机对象,但它没有帮助.每次运行模拟时,第一年总是正常工作,然后Random.Next()开始只返回0.
有没有人有关于我应该在哪里寻找bug的想法?谢谢!
我不相信Random类被设计为线程安全(可以从多个线程同时使用) - 所以如果你以这种方式共享一个实例,你可能会破坏随机生成器的状态,阻止它运行正确.
您可以修饰保存对Random类的引用的静态变量ThreadStatic,这将允许您为每个线程维护一个单独的实例:
[ThreadStatic]
private static Random m_Random; // don't attempt to initialize this here...
public void YourThreadStartMethod()
{
// initialize each random instance as each thread starts...
m_Random = new Random();
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是.NET 4.0,那么还有一个ThreadLocal<T>类,这有助于简化每个线程初始化一个实例.
| 归档时间: |
|
| 查看次数: |
3305 次 |
| 最近记录: |