【发布时间】:2014-12-09 02:31:34
【问题描述】:
在制作一种方法以将新创建的表单放置在我的屏幕上完全随机的位置而不超出所述屏幕的范围时,我收到了一条有趣的代码合同消息...
合约需要未经证实的 minValue
...在使用代码时:
Location = new Point(
this.rnd.Next(targetBounds.Left, targetBounds.Right - Width),
this.rnd.Next(targetBounds.Top, targetBounds.Bottom - Height));
看了.Net implementation我很困惑。
我的问题是,为什么当最大值为
是否有任何原因(除了可能没有发现晦涩的错误)为什么不应该允许 Random.Next(100, 50)?
如果您说“给我一个介于 100(不含)和 50(含)之间的随机数”和“...介于 50(含)和 100(不含)之间”,这应该没什么区别。
数字的范围还是一样的,不是吗?
这是在考虑 Random.Next(1, 2) 和 Random.Next(1, 1) 的缺陷之前,这两个都是完全有效的代码,没有任何警告。每一代都返回 1 并且实际上应该警告用户这种行为。
EDIT 调用 Random.Next(20, 20) 时潜在陷阱的示例。
如果您在代码中假设提供 20 的上限将始终为您提供介于下限和 19 之间的随机数,并且允许您的下限达到 20(包括您在内),在这种特殊情况下,可能会破坏您的代码下限达到 20,因为这是 Random.Next 将返回 20 的一种情况。假设您有一些上限为数百万的代码,可能需要一些时间才能突然遇到这种边缘情况。至少它已记录在案。
我已经知道这个问题了:Why can minValue == maxValue in Random.Next?
【问题讨论】:
-
答案是“他们可以拥有,但他们没有”。编程语言和库充满这样的怪癖,除了你认为是怪癖,其他人可能称之为设计决策 :-) 你讨论的所有行为都有据可查,它不像这是一个错误(如果 doco 是错误的)甚至是灰色的(如果 doco 没有提到它)。它清楚地说明了所有人都可以阅读和注意。
-
添加到 @paxdiablo ,他们可能会这样做以保留 .Net 框架中的一些早期实现。简而言之,不要破坏一些早期内部实现的功能。
-
我非常高兴他们没有这样做。如果我将某些东西传递给名为“minValue”的参数,我希望该方法将其视为最小值。它直观且有意义,给您一个明确的期望。如果参数是“oneExtreme”和“theOtherExtreme”,那么可以,但不是。
-
实际上,我想扩展我的评论,但我变得如此冗长和喋喋不休(今天的词,技术上不正确,但自从凯撒使用这个词以来,我就喜欢这个词它在 Asterix 漫画中)只适合答案:-)