0

私は自分で乱数エンジンを実装しています(いいえ、私は乱数エンジンを発明していません)。パラメーターが負の場合に何をすべきか知りたいです。だから私はmersenne_twister_engineのコードをチェックしてこれを見つけました:

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

これらの場所でunsignedタイプは危険ではありませんか?

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 に答える