0

Solution以下のように定義された名前のクラスがあります。関連するコードのみを含めており、カスタム コピーまたは代入演算子は記述していません。

class Solution {

public:

    Solution() {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }

    RandomNumberStream stream;

private:

    static long seedShift = 0;
};

Solutionここでのポイントは、 の新しいインスタンスごとに異なる乱数ストリームを持たせたいということです。これは機能します。

Solutionただし、問題は、からのインスタンスをコピーstd::vector<Solution>し、わずかに変更してから、そのコピーを同じ にプッシュする場所がいくつかあることですstd::vector<Solution>Solutionこれが発生すると、同じ乱数シードを持つ の 2 つのインスタンスが発生し、災害が発生します。

ベクトルにプッシュされたコピーされたインスタンスでstream.setNewSeed(seedShift+static_cast<long>(12345));andステートメントを実行するにはどうすればよいですか?++seedShift;Solution

4

2 に答える 2

1

代入演算子をオーバーロードします。注-これは、ベクトルから値を読み取ったり、ベクトル自体をコピーしたりすると、乱数シードも再び変更されることを意味します。

class Solution {

public:

    Solution() {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }

    Solution& operator=(Solution& other)
    {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;


        x = other.x;
        y = other.y;
        z = other.z;


        return *this;
    }

    RandomNumberStream stream;

private:

    static long seedShift = 0;
};
于 2013-04-15T04:26:04.233 に答える
1

a へのプッシュvectorは、コピー コンストラクターを使用します (またはムーブ コンストラクターですが、簡単に作成し、ここではコピー コンストラクターを使用すると仮定します)。これには署名があります:

Solution(const Solution& rhs);

次に、このロジックをかなり簡単に実装できます。

Solution(const Solution& rhs)
{ 
     stream.setNewSeed(seedShift + 12345L);
     ++seedShift;
}

これを実装する場合は、おそらくコピー代入演算子も実装する必要があることに注意してください。

Solution& operator=(const Solution& rhs)
{
    if(this != &rhs) {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }
    return *this;
}
于 2013-04-15T04:29:28.247 に答える