我编写了以下代码来生成某些数字{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;
}
答案 0 :(得分: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。
答案 1 :(得分:3)
使用0到31之间的数字填充向量,然后使用线性时间随机混洗算法,例如Fisher-Yates。