C# NET中的设计目标/首选项';s随机类

C# NET中的设计目标/首选项';s随机类,c#,.net,random,C#,.net,Random,我在一些项目中使用过.NET的Random类,但我经常想知道的一件事是,为什么它被设计为一个实例对象,而不是使用返回随机值的静态方法 例如: Random rnd = new Random() int x = rnd.Next(0, 255); 是否有任何原因或设计选择来解释为什么它没有同时使用实例和静态方法进行设计,以便我可以这样做: int x = Random.Next(0, 255); 有什么原因没有实现此功能,因为我认为它会很有用吗?系统。Random有两个构造函数,一个是裸构造函

我在一些项目中使用过.NET的Random类,但我经常想知道的一件事是,为什么它被设计为一个实例对象,而不是使用返回随机值的静态方法

例如:

Random rnd = new Random()
int x = rnd.Next(0, 255);
是否有任何原因或设计选择来解释为什么它没有同时使用实例和静态方法进行设计,以便我可以这样做:

int x = Random.Next(0, 255);

有什么原因没有实现此功能,因为我认为它会很有用吗?

系统。Random
有两个构造函数,一个是裸构造函数,另一个是接受种子的构造函数(生成任意随机数的基础)

如果这是一个静态方法,那么您要么每次都需要传递种子,要么允许某种默认值

你可能想检查一下这个问题,看看为什么种子真的很重要


随机作为实例对象,允许您配置随机生成器

为不同的随机对象提供相同的种子值会导致 每个实例生成相同的随机数序列

例如,在进行测试时,这会变得非常方便


请参见

如果存在静态的Random。下一个方法,如您所建议的,它的设计必须确保多个线程同时调用它不会破坏状态。当前的
Random
类不支持多个并发用户

另外,如果只有一个
Random
实例,那么代码中不可能有两个部分依赖于不同的随机序列。我在用C编写代码时多次遇到这个问题,C有一个全局随机数生成器。最后,我不得不编写自己的每个实例生成器


使随机数生成器成为一个实例类而不是静态类会给您带来更大的灵活性。如果您只想在程序中使用一个全局对象,请在全局范围内声明并使用它,就像只有一个静态
Random
对象一样。它最后是一行额外的代码。

对。有时你可能想“给我从这个特定种子开始的随机数”,但大多数时候你想“给我尽可能随机的随机数”。设计
random
的人是否会在这里插话,让人们猜测和回答(即不是基于事实)是非常值得怀疑的。需要编写静态方法来支持多线程和重入。很可能您希望两个线程独立地生成随机数——这是使用“全局”静态方法无法做到的。我同意实例和静态方法的组合将是一个有用的方向。有时,您需要一点一次性的随机性,而不必担心显式管理RNG。我创建了一个包含静态便利方法的类,比如
Rand.NextDouble()
(比如Java中的
Math.random()
)和
Rand.Current
(线程安全静态
random
实例)。只有当类只提供静态成员时,这才是一个问题。建议的添加可以很容易地使用时钟基种子。