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

xpo*_*ort 4 c# random

脚本

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

我有两个选择:

  1. 我创建了一个在整个应用程序中共享的单个全局Random对象.所有需要随机值的方法都有一个随机类型的参数,我传递了全局Random对象.
  2. 我不创建全局Random对象,但每个方法在本地声明其Random对象.

限制是:我想保留应用程序以实际产生独特的输出.

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

Mar*_*ell 5

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

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

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

foreach(var foo in foos) foo.SomeMethod();
Run Code Online (Sandbox Code Playgroud)

如果SomeMethod旋转a Random,你很可能会看到重复的值.