0

我自己正在实现一个随机数引擎(不,我没有发明一个)并且想知道如果参数为负数应该怎么做。所以我检查了 mersenne_twister_engine 的代码,发现了这个:

void discard(unsigned long long _Nskip)
{   // discard _Nskip elements
    for (; 0 < _Nskip; --_Nskip)
        (*this)();
}

无符号类型在这些地方不危险吗?

4

2 回答 2

2

只有当条件是 时才危险x <= 0x > 0(或0 < x)是安全的。

基本上你必须避免的是从 0 中减去(更具体地说,你需要它这样x - y >= 0)。for 语句将最后一次执行,如果循环检查是否等于 0,那将是一个问题(0 - 1 通常 = 最大值)。只要 1 是结束条件,减去 1 即可 ( 1 - 1 >= 0)。

编辑:再次阅读您的问题后,我不确定我是否解决了实际问题(我认为您可能在 5 分钟的窗口内进行了编辑?或者我只是没有阅读它。))

无论如何,David Rodriguez 提到了它未签名的原因:丢弃负数的元素没有意义。(另外,如果你确实设法将一个负值传递给那个[以它的形式],那将是一个巨大的正数的位模式,并且会发生糟糕的、糟糕的事情。)

于 2012-09-29T03:51:24.940 回答
1

有些人喜欢使用unsigned只存储正数的变量。其他一些人不想unsigned用来表示那个意思。

这是一个经常被讨论的话题。我在后一个阵营:我不会unsigned在这样的参数中使用。例如,当我为 -like 类编写size()函数时,我使用,即使大小永远不会小于 0。listint

如果您愿意,使用断言或测试并抛出来拒绝负值int似乎是合适的。阵营中的人unsigned会说,当你传递一个负值时,编译器应该在调用端发出警告。你可以继续争论,我相信你会在互联网上找到很多。

于 2012-09-29T22:39:22.817 回答