单个全局随机对象与一组本地随机对象之间的优缺点

时间:2011-01-18 08:20:49

标签: c# random

方案

我正在开发一个集中使用随机生成的值的应用程序。

我有两个选择:

  1. 我创建了一个在整个应用程序中共享的单个全局Random对象。所有需要随机值的方法都有一个随机类型的参数,我传递了全局随机对象。
  2. 我不创建全局Random对象,但每个方法在本地声明其Random对象。
  3. 约束是:我想保留应用程序以实际产生唯一的输出。

    问题

    单个全局随机对象与一组本地随机对象之间的优缺点是什么?

2 个答案:

答案 0 :(得分:5)

单个Random的问题在于您可能将其(直接或间接通过异步代码/回调)传递给多个线程。由于Random不是线程安全的,因此您需要信任该代码进行同步。如果您不相信代码,请为执行同步的Random编写一个包装器,或者使用[ThreadStatic] / ThreadLocal<T>实例。

另请注意,随机与独特不完全相同......

但是,如果在方法中声明它 - 那么任何紧密循环实际上都保证为每个循环迭代生成相同的值 - 即

foreach(var foo in foos) foo.SomeMethod();

如果SomeMethod旋转Random,您很可能会看到重复的值。

答案 1 :(得分:4)

除了马克所说的:

全局随机数生成器的优点是您只需要播种一次。如果您想获得可重现的结果,这可能会有所帮助(对于调试,如果您不相信结果是基于错误而不是“不可能的随机数”,您可以使用相同的种子存储已使用的种子并运行应用程序)。