为什么Random.Next()返回int而不是uint?

4
根据MSDN文档,方法Random.Next()返回非负随机数。为什么它返回int而不是uint?似乎应该返回一个均匀分布在所使用类型范围内的值。从使用角度来看,如果您使用int,它应该覆盖int的范围,如果您使用uint,它也应返回该类型上的均匀分布。这不正是使用类型的目的吗?

5
只有三个重载方法中的两个返回正数。传入最小值参数的重载方法可以返回负数。 - Servy
1
询问设计师为什么这样做没有多大意义。如果想要获得随机的 uint,可以将Random.NextDouble()乘以uint.MaxValue - Jim Mischel
此外,最常见的用法是获取一个随机值,使得0 <= value <= N,其中N是某个用户指定的值。API设计者很可能让最常见的用法更容易,并允许使用负数,通过重载来让你指定范围。 - Jim Mischel
@Servy 我认为 + (uint)int.MaxValue 不是必需的,任何负值在转换为 uint 时都会被转换为它的二进制补码值。 - Scott Chamberlain
@ScottChamberlain 是的。 - Servy
2个回答

16

1
这引出了一个问题,为什么uint不符合CLS规范。 - It'sNotALie.
2
因为至少在编写CLS时,并非所有的.NET语言都支持无符号类型。 - Mike Strobel
1
@MikeStrobel 这基本上就是在再次提出问题了... - Servy
1
@Servy:按照这个逻辑,我们应该问为什么一开始会有无符号类型等等。这真的不比其他问题更值得探讨。 - user7116
1
@baultista,感谢您提供的信息!考虑到BCL是为各种语言设计的,这是有道理的。有趣的是,这会导致一些奇怪的问题。 - Zac
显示剩余4条评论

0

我不知道微软为什么这样做。
但如果你想要随机的UInt32,那很容易实现。

Random ran = new Random();
Debug.WriteLine(Int32.MaxValue.ToString());
Debug.WriteLine(((UInt32)ran.Next(Int32.MinValue, Int32.MaxValue)).ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接