1

カード ゲームのシミュレーションを何百万回も実行して、「カジノ ハウス エッジ」のパーセンテージを返そうとしています。

rand() 関数の私の理解は、これが毎回新しいシャッフルを生成するのか、それとも制限があるのか​​ を知るのに十分明確ではありません. 言い換えれば、100 万回のゲームのいずれかの時点で、同じパターンのシャッフルが出現するでしょうか?

  srand(time(NULL));

for (int games=0;games<iGames;games++){

                  ///shuffle///
for (int i=0; i<(iUserDeckSize-1); i++) {
    int r = i + (rand() % (iUserDeckSize-i)); // Random remaining position.
    card temp = cards[i]; cards[i] = cards[r]; cards[r] = temp;
}

// rest of card game code goes here
}
4

2 に答える 2

1

実装固有だと思います。たとえば、ここを参照してくださいCのrand()に使用される一般的なアルゴリズムは何ですか?. しかし、実用的な実装がそれをすぐに繰り返し始めたとしたら、私は驚かれることでしょう。少なくとも int32 で許可されている数十億に到達すると思っていたでしょう。

于 2012-12-25T00:10:26.747 に答える
0

いいえ、2つの理由があります(1つはあなたが考えたもので、もう1つはそれほど明白ではありません)。

使用しているアルゴリズムが間違っています。気になる-1(最後の要素はまったくシャッフルされません)を別にすれば、シャッフルがn^n可能である間、実行(受信した乱数のスペース)がn!可能です。一般に、出力にバイアスがかかってn!いる要因ではn^nありません(つまり、一部の結果は他の結果よりも頻繁に発生します)。Knuth-Taresシャッフルをrandom_shuffle実装するか、 fromのようなすでに実装されているアルゴリズムを使用することをお勧めします<algorithm>

とはいえ、少なくともn!状態を持つPRNGが必要です。デッキのサイズによっては、rand()では不十分な場合があります。通常は48ビットですが、標準の52カードデッキには225ビットの状態(log2(52!))があります。つまり、一部のシーケンスにヒットする可能性はありません(そうでない場合もあります)。問題はありますが、より良いPRNGのオーバーヘッドはごくわずかです)。いくつかの優れたPRNG実装があり、少なくとも1つはおそらく十分に優れているため(52枚のカードの例ではmt11213bなど)、ブーストランダムを検討します。

于 2012-12-25T00:29:46.360 に答える