C#Random.Next-从不返回上限?


76
random.Next(0,5)

它从不返回5(但有时返回0。)为什么?我认为这些只是可以返回的边界值。谢谢


6
为什么这样做呢?不必要的混淆。

3
为什么?可能是因为这样:var randomValue = myArray [rand.Next(0,myArray.Length)];
Brett Allen

24
我发现此文档比重新键入代码和触发智能感知或搜索MSDN库更快。在调试或读取代码时,通常不会键入代码。我直观地将“ maxValue”读为“最大可能值”,而不是“最大值减去一”。无需将OP告知RTFM。
JonH 2014年

9
我知道我来晚了,但是我对此完全感到惊讶。像世界上其他所有人一样,我将“ maxValue”读为该函数将返回的最大数字。因此,我很确定自己在生产中已经破坏了代码。
布兰登2014年

奇怪的是,如果minValue == maxValue,它将返回maxValue。同样,Next(0)(表面上隐式的minValue为0只会返回0。以一种无关紧要的方式
非常奇怪

Answers:


145

maxValue在上界Next()方法是排他性-the范围包括minValuemaxValue-1,以及两者之间的所有数字。


13
关于他们为什么选择一个包容性和另一个包容性的任何想法?似乎有点奇怪...
荒谬的

19
其中,我能想到的一个原因是array[random.Next(0, array.Length)]
马克CIDADE

7
名称maxValue(作为参数的调用)会引起误导。它应该被称为上界。由于最大值始终是集合的元素。
哈里·贝瑞

1
@AntonioNakicAlfirevic -在这里看到这种行为背后的理由:programmers.stackexchange.com/questions/311250/...
马特Wilko

6
更令人困惑的是,如果您为minValue和maxValue传递相同的值,则maxValue不再是排他的。描述“返回特定范围内的随机整数”也具有误导性。
EventHorizo​​n

14

文件称,上限是排斥的。互斥意味着它不包含在可能的返回集中。在0 <= x < 5这种情况下,采用更数学的表示法。


1
对于min = max,情况并非如此。如果minValue等于maxValue,则返回minValue。
jasdefer

5
@jasdefer在这种情况下,为什么返回minValue而不是maxValue
qxz

@qxz我只是在谈论这种情况:minValue= maxValue。在这里,如果不要紧minValuemaxValue返回,因为他们是平等的。 minValue <= x < maxValue是不正确的。如果minValue= maxValue= 0,则返回x = 0,并且0 <0不是true。
jasdefer

6

直接来自文档:

 Summary:
   Returns a random number within a specified range.

 Parameters:
   minValue:
     The inclusive lower bound of the random number returned.

   maxValue:
     The exclusive upper bound of the random number returned. maxValue must be
     greater than or equal to minValue.

 Returns:
     A 32-bit signed integer greater than or equal to minValue and less than maxValue;
     that is, the range of return values includes minValue but not maxValue. If
     minValue equals maxValue, minValue is returned.

如果查看参数,您将看到这minValue是包含的(这就是您的0出现的原因)和maxValue唯一的(您的5从未出现)的原因。


2

记住它的一个好方法是将max视为从中获取随机数的数量。因此random.Next(0,2),它表示从0:0和1开始的2个数字中随机抽取了一个。


1
仅在给定下限为0的情况下,这是记住它的好方法。例如random.Next(1,2)会从1开始随机选择2个数字

1

这是很久以前写的,但我还是要评论。我认为做出此设计决定的主要原因是,即使不是全部,大多数随机数生成器的核心也会生成0到2 ^ 32-1的数字。因此,如果指定Int32.MaxValue,则永远不会获得该数字。设计师不能接受一个数字例外的情况,因此他们决定使用专用的支架。问题解决了!


-2

当您只是在Google中查找“ c#random”并遵循第一个链接到欲望的方法时,您会获得以下信息:http : //msdn.microsoft.com/zh-cn/library/aa329893(v=vs.71)。 aspx

而且没有关于上限的排他性的暗示。他们必须在代码中找到错误,并通过文档进行了更正。

因此,重要的是在查看文档时始终检查框架的版本。即使使用旧版本的框架,也值得一看新的文档。


2
单击发布的链接,发现:“返回值-一个大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue但不包括MaxValue。如果minValue等于maxValue,则minValue返回。”
dbasnett 2011年

3
正如dbasnett所说,文档确实在此处指定了行为。不仅如此,这还是为随机数之类的对象定义范围的常规方法。IMO,您认为这实际上是一个错误,这是一个可怜的错误。
乔恩·斯基特

一种非直觉的类型,允许maxValue与minValue相同,因为那会导致有效值集始终为空
Grubsnik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.