以随机顺序迭代数组

时间:2013-09-24 23:52:16

标签: c++ arrays loops vector

给定一系列N元素(比如std::vectorT*),是否有任何有效的方法以随机顺序迭代其元素,只需访问每个元素一次。解决方案必须避免使用混洗索引创建其他数组。

修改

此外,我们需要能够跟踪原始索引

3 个答案:

答案 0 :(得分:13)

不是特别随机,但考虑到你的限制,你几乎没有选择。

A is the array
S is the size of the array
Generate a random prime number (P), such that P > S
Q = P % S
for i = 1 to S
    process A[Q]
    Q = (Q + P) % S

答案 1 :(得分:6)

使用std::random_shuffle,因此您的代码将是这样的:

std::random_shuffle ( myvector.begin(), myvector.end() );  // in place no extra array
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
   std::cout << ' ' << *it;

答案 2 :(得分:0)

好吧,我并不完全清楚制作额外数组的限制。但实质上,我们随机生成一个索引,然后重复,如果我们达到了已经命中的索引,则重新生成。它不一定有效。但是,我猜测边界肯定在O(n ^ 2)和O(n!)之间(可能是(O(n ^ n))。只需要做一点工作,我们就可以清理它并获得几乎总是落在n ^ 2上。