我正在开发一个集中使用随机生成的值的应用程序。
我有两个选择:
约束是:我想保留应用程序以实际产生唯一的输出。
单个全局随机对象与一组本地随机对象之间的优缺点是什么?
答案 0 :(得分:5)
单个Random
的问题在于您可能将其(直接或间接通过异步代码/回调)传递给多个线程。由于Random
不是线程安全的,因此您需要信任该代码进行同步。如果您不相信代码,请为执行同步的Random
编写一个包装器,或者使用[ThreadStatic]
/ ThreadLocal<T>
实例。
另请注意,随机与独特不完全相同......
但是,如果在方法中声明它 - 那么任何紧密循环实际上都保证为每个循环迭代生成相同的值 - 即
foreach(var foo in foos) foo.SomeMethod();
如果SomeMethod
旋转Random
,您很可能会看到重复的值。
答案 1 :(得分:4)
除了马克所说的:
全局随机数生成器的优点是您只需要播种一次。如果您想获得可重现的结果,这可能会有所帮助(对于调试,如果您不相信结果是基于错误而不是“不可能的随机数”,您可以使用相同的种子存储已使用的种子并运行应用程序)。