我在C ++中有一个带有排序数据的向量,我想以随机顺序访问数据以便对数据进行混洗。 rand的问题是可以同时访问两个索引,并且当最后一个项目保留时,将会有很多不需要的查找。任何建议。
答案 0 :(得分:4)
您可以使用std::shuffle
中的<algorithm>
简单地对数组进行随机播放。它需要一个指向第一个位置的迭代器来进行混洗,一个迭代器指向要考虑进行混洗的最后一个位置,以及一个RNG引擎。在以下示例中,我将使用std::default_random_engine
中的<random>
。
#include <iostream>
#include <algorithm>
#include <random>
#include <vector>
int main() {
std::vector<int> v{1, 2, 3, 4, 5, 6};
auto rng = std::default_random_engine{};
std::shuffle(std::begin(v), std::end(v), rng);
for(auto&& e: v) {
std::cout << e << " ";
}
std::cout << '\n';
}
当我跑步时,我得到了:
3 1 5 6 2 4
没有关于如何实施std::shuffle
的详细信息,但它很可能是O(n)
shuffle算法,如Fisher-Yates(Knuth)Shuffle,因此赢得了#t} 许多&#34;不需要&#34;查找。
答案 1 :(得分:3)
如果您不想修改原始内容并且只访问每个元素一次,则可以随机播放索引向量:
#include <algorithm>
#include <random>
auto engine = std::default_random_engine{};
const std::vector<int> numbers = {4, 5, 7, 12};
std::vector<int> indices(numbers.size());
std::iota(indices.begin(), indices.end(), 0);
std::shuffle(indices.begin(), indices.end(), engine);
for (auto i : indices)
{
std::cout << numbers[i] << std::endl;
}
答案 2 :(得分:1)
您可以创建一个随机向量。见random_shuffle。在链接中有一个完整的例子,为了简洁,我不会发布一个。