我在一些项目中使用了 .NET 的 Random 类,但我经常想知道的一件事是为什么它被设计为实例对象,而不是具有返回随机值的静态方法。
例如:
Random rnd = new Random()
int x = rnd.Next(0, 255);
是否有任何理由或设计选择来说明为什么它没有同时使用实例和静态方法进行设计,以便我可以这样做:
int x = Random.Next(0, 255);
是否有任何原因没有实现此功能,因为我认为它会很有用?
System.Random
有两个构造函数,一个是裸的,一个是接受种子的(生成任何随机数的基础)。
如果这是一个静态方法,那么您要么需要每次都传递种子,要么允许某种默认值。
您可能想检查这个 SO question,了解为什么种子真的很重要。
如果有Random.Next
您建议的静态方法,则必须将其设计为多个线程同时调用它不会破坏状态。当前Random
类不支持多个并发用户。
此外,如果只有一个Random
实例,您的代码不能有两个部分依赖于不同的随机序列。我在用 C 编码时多次遇到这个问题,它有一个全局随机数生成器。我最终不得不编写自己的每个实例生成器。
使随机数生成器成为实例类而不是静态类可以为您提供更大的灵活性。如果您只想在程序中使用一个全局对象,请在全局范围内声明并使用它,就像只有一个静态Random
对象一样。它最终是一行额外的代码。
Random 作为实例对象允许您配置 Randomgenerator;
为不同的 Random 对象提供相同的种子值会导致每个实例产生相同的随机数序列。
这在例如测试时会变得非常方便