向量

时间:2016-01-19 15:44:50

标签: c++ random vector

我在C ++中有一个带有排序数据的向量,我想以随机顺序访问数据以便对数据进行混洗。 rand的问题是可以同时访问两个索引,并且当最后一个项目保留时,将会有很多不需要的查找。任何建议。

3 个答案:

答案 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。在链接中有一个完整的例子,为了简洁,我不会发布一个。