1

特定の数字 {0,1,2,...,31} のランダムなシーケンスを生成する次のコードを作成しました。正常に動作しますが、限られた時間内に完了することを保証することはできません。任意の間隔の後でも、完了する可能性は一定の (非常に高い) 確率のみです。この問題を取り除くための提案はありますか?

int th;
vector<int> V2 = vector<int> (32,0);
for (int k=0;k<32;k++){

    do{
        th = rand() % 32;
    } while ( V2[th] == 0 );

    V2[th] = k;
}
4

2 に答える 2

7

そして実際の実装:

int a[] = { 0, 1, 2, ....., 31 };
std::random_shuffle(a, a + 32);

またはベクトルで:

std::vector<int> v(a, a + 32); // from previous snippet
std::random_shuffle(v.begin(), v.end());

さらに、通常のように、真のランダム順列が必要な場合は、PRNG をシードすることを忘れないでください。

于 2013-06-19T18:22:24.347 に答える
3

ベクトルに 0 ~ 31 の数値を設定し、Fisher-Yatesなどの線形時間ランダム シャッフル アルゴリズムを使用します。

于 2013-06-19T18:20:56.753 に答える