C++ 随机抽样的最佳方法

Hum*_*Hum 4 c++ vector visual-c++

我有一个长度为 100 万(0 到 100 万)的数据向量 A。从 A 开始,我想创建包含 A 索引的向量 B(其长度可以说只是 A 的 10%)。这些索引是从 A 中随机抽取的样本索引。我尝试使用 srand() 和 random_shuffle,这是一个好方法吗?提取非常大的向量样本的方法?有人可以建议我吗?

  std::vector <int> samplingIndex;

   for (int i = 0; i < 1000000; ++i) { samplingIndex.push_back(i); } 
   std::srand(50); 
   std::random_shuffle(samplingIndex.begin(), samplingIndex.end());
Run Code Online (Sandbox Code Playgroud)

之后,我从采样索引中取出前 10% 的索引来制作 B。

Jar*_*d42 6

您可以使用Fisher\xe2\x80\x93Yates shuffle,然后避免构造巨大的数组a

\n

就像是:

\n
// Fisher\xe2\x80\x93Yates_shuffle\nstd::vector<int> FisherYatesShuffle(std::size_t size,\n                                    std::size_t max_size,\n                                    std::mt19937& gen)\n{\n    assert(size <= max_size);\n    std::vector<int> res(size);\n\n    for (std::size_t i = 0; i != max_size; ++i) {\n        std::uniform_int_distribution<> dis(0, i);\n        std::size_t j = dis(gen);\n        if (j < res.size()) {\n            if (i < res.size()) {\n                res[i] = res[j];\n            }\n            res[j] = i;\n        }\n    }\n    return res;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

实例

\n