C# 单个全局随机对象与一组局部随机对象之间的优缺点 脚本

C# 单个全局随机对象与一组局部随机对象之间的优缺点 脚本,c#,random,C#,Random,我正在开发一个广泛使用随机生成值的应用程序 我有两个选择: 我创建一个全局随机对象,在整个应用程序中共享。所有需要随机值的方法都有一个随机类型的参数,我将全局随机对象传递给它 我不创建全局随机对象,但每个方法都在本地声明其随机对象 约束条件是:我希望使应用程序实际产生唯一的输出 问题: 单个全局随机对象与一组本地随机对象之间的优缺点是什么?单个随机对象的问题是,您可能将其(直接或通过异步代码/回调间接)传递给多个线程。由于Random不是线程安全的,所以您需要信任该代码进行同步。如果您不能信任代

我正在开发一个广泛使用随机生成值的应用程序

我有两个选择:

  • 我创建一个全局随机对象,在整个应用程序中共享。所有需要随机值的方法都有一个随机类型的参数,我将全局随机对象传递给它
  • 我不创建全局随机对象,但每个方法都在本地声明其随机对象
  • 约束条件是:我希望使应用程序实际产生唯一的输出

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

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

    还要注意的是,随机性和唯一性并不是一回事

    然而,如果你在一个方法中声明它,那么任何紧循环实际上都保证为每个循环迭代生成相同的值

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

    如果
    SomeMethod
    旋转出一个
    随机数
    ,您很可能会看到重复的值。

    除了Marc所说的:

    全局随机数生成器的优点是只需进行一次种子设定。如果您希望获得可重复的结果,这可能会很有帮助(对于调试,如果您不相信结果是基于bug而不是“不太可能的随机数”,您可以存储使用过的种子,然后使用相同的种子运行应用程序)