VCCC  2024.05
VisualCamp Common C++ library
sample.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_RANDOM_SAMPLE_HPP
6 # define VCCC_RANDOM_SAMPLE_HPP
7 #
8 # include <iterator>
9 # include <random>
10 # include <vector>
11 #
12 # include "vccc/__random/pick.hpp"
13 
14 namespace vccc {
15 
18 
33 template<typename T, typename Container = std::vector<T>>
34 Container
35 random_sample(T a, T b, T k, std::mt19937&& gen = std::mt19937(std::random_device{}()))
36 {
37  auto elems = pick_k(a, b, k, gen);
38  Container result(std::make_move_iterator(elems.begin()), std::make_move_iterator(elems.end()));
39  std::shuffle(result.begin(), result.end(), gen);
40  return result;
41 }
42 
43 template<typename T, typename Container = std::vector<T>, typename Generator>
44 Container
45 random_sample(T a, T b, T k, Generator&& gen)
46 {
47  auto elems = pick_k(a, b, k, gen);
48  Container result(std::make_move_iterator(elems.begin()), std::make_move_iterator(elems.end()));
49  std::shuffle(result.begin(), result.end(), gen);
50  return result;
51 }
52 
54 
55 } // namespace vccc
56 
57 # endif // VCCC_RANDOM_SAMPLE_HPP
Container random_sample(T a, T b, T k, std::mt19937 &&gen=std::mt19937(std::random_device{}()))
get shuffled random sample in [a, b], size k
Definition: sample.hpp:35
Container pick_k(T a, T b, T k, RandomGenerator &&gen)
pick k from int range [a, b] (no duplicates)
Definition: pick.hpp:34
Definition: directory.h:12