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 回答