2

カードのデッキをシャッフルするために C++11 乱数ジェネレーターを使用しようとしています。エンジンが同じ値でシードされている場合、2 つのエンジンによって生成される乱数シーケンスが同じであることを (実装を調べて) 発見しました。

次のコードを検討してください。

DECK::DECK()
{
    // Initialize deck to contain the standard 52 cards in an unsorted manner.
}

void DECK::shuffle()
{
    std::default_random_engine e;
    // Use 'e' to shuffle the deck
}

int main(int, char* [])
{
    DECK d1, d2;
    d1.shuffle();
    d2.shuffle(); 

    // 'd1' and 'd2' are identical!
}

仕様は次のとおりです。

1) プログラムの出力は決定論的です (つまり、同じ入力は同じ出力を生成します)。

2) カードの DECK を同時にシャッフルするには、複数のスレッドが必要です。

3) パフォーマンスは重要です。ロックを使用したくない (他に選択肢がない場合を除く)。

仕様 1 のため、std::default_random_engine にシステム時刻をシードすることはできません。仕様 2 と 3 により、エンジンをシングルトンにすることは選択肢にないようです。誰かがこれをコード化するより良い方法を持っていますか?

4

2 に答える 2

0

非常に単純なXORshiftを実装することで、独自の乱数ジェネレーターを使用できると思います。わずか 9 行のコードしかなく、すべてが自動的に行われていることがわかります。そして、それは間違いなく非常に高速です。

基本的に、各スレッドには独自の XORshift RNG があります。適切にシードする必要があるだけです(x、y、z、およびwを(0,0,0,0)以外の任意の値に設定するだけです)

于 2013-05-17T16:29:47.180 に答える