カードのデッキをシャッフルするために 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 により、エンジンをシングルトンにすることは選択肢にないようです。誰かがこれをコード化するより良い方法を持っていますか?