Vcsn  2.1
Be Rational
random.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <random>
4 #include <iterator>
5 
7 
8 namespace vcsn
9 {
10 
11  // Based on https://gist.github.com/cbsmith/5538174.
12  template <typename RandomGenerator = std::default_random_engine>
14  {
15  random_selector(const RandomGenerator& g = RandomGenerator())
16  : gen_(g)
17  {}
18 
20  template <typename Iter>
21  Iter select(Iter start, Iter end)
22  {
23  std::uniform_int_distribution<> dis(0, std::distance(start, end) - 1);
24  std::advance(start, dis(gen_));
25  return start;
26  }
27 
29  template <typename Iter>
30  Iter operator()(Iter start, Iter end)
31  {
32  return select(start, end);
33  }
34 
36  template <typename Container>
37  auto operator()(const Container& c) -> decltype(*std::begin(c))
38  {
39  return *select(std::begin(c), std::end(c));
40  }
41 
43  template <typename Container>
44  auto pop(Container& c) -> typename Container::value_type
45  {
46  auto i = select(std::begin(c), std::end(c));
47  auto res = *i;
48  c.erase(i);
49  return res;
50  }
51 
52  private:
53  RandomGenerator gen_;
54  };
55 
56 
57  template <typename RandomGenerator = std::default_random_engine>
58  struct random_selector<RandomGenerator>
59  make_random_selector(const RandomGenerator& g)
60  ATTRIBUTE_PURE;
61 
62  template <typename RandomGenerator>
63  struct random_selector<RandomGenerator>
64  make_random_selector(const RandomGenerator& g)
65  {
66  return g;
67  }
68 
69 } // !vcsn
struct random_selector< RandomGenerator > make_random_selector(const RandomGenerator &g) ATTRIBUTE_PURE
Definition: random.hh:64
Iter operator()(Iter start, Iter end)
A randomly selected iterator in [start, end).
Definition: random.hh:30
random_selector(const RandomGenerator &g=RandomGenerator())
Definition: random.hh:15
auto pop(Container &c) -> typename Container::value_type
A randomly selected member of c. Remove it from c.
Definition: random.hh:44
auto operator()(const Container &c) -> decltype(*std::begin(c))
A randomly selected member of c.
Definition: random.hh:37
RandomGenerator gen_
Definition: random.hh:53
Iter select(Iter start, Iter end)
A randomly selected iterator in [start, end).
Definition: random.hh:21