为什么System.Random类不是静态的?

24 c# random static instance

使用System.Random该类时,必须创建它的实例.为什么不static呢?因为如果我想要一个0到9之间的随机数,我可以使用静态方法,System.Random.Next(int, int):

int ourRandomNumber = Random.Next(0,9);
Run Code Online (Sandbox Code Playgroud)

那么为什么不上课static呢?

Bro*_*ass 31

如果它是静态的,您将无法使用不同的种子 - Random实例会跟踪该状态.默认情况下,Random使用当前时间作为种子,但重新使用特定种子(即new Random(42))允许您精确重复随机数序列 - 它们对于同一种子始终是相同的.这方面在某些应用中非常重要.例如,Minecraft.


Jon*_*eet 17

Random不是线程安全的.Random每个线程有一个实例,但不应同时使用多个线程中的一个实例.因此,您不能只Random在静态变量中使用一个实例并使用静态方法中的实例.

此外,如果提到的话,将其设为静态会消除给出特定种子的机会BrokenGlass.

当然,在不需要指定种子的情况下创建处理线程安全性的静态方法并不难,但是当您想要使用特定实例时仍然保留实例方法.就个人而言,我认为将"随机数源"视为在适当时注入的依赖是恰当的.

我有一篇文章介绍了其中的一些内容,您可能会觉得它很有用.