Empirical
random_utils.h
Go to the documentation of this file.
1 
11 #ifndef EMP_RANDOM_UTILS_H
12 #define EMP_RANDOM_UTILS_H
13 
14 #include "../base/vector.h"
15 #include "BitVector.h"
16 #include "Random.h"
17 
18 namespace emp {
19 
23 
24  template <typename T>
25  inline void Shuffle(Random & random, emp::vector<T> & v, size_t max_count)
26  {
27  for (size_t i = 0; i < max_count; i++) {
28  const size_t pos = random.GetUInt(i, v.size());
29  if (pos == i) continue;
30  std::swap(v[i], v[pos]);
31  }
32  }
33 
34  template <typename T>
35  inline void Shuffle(Random & random, emp::vector<T> & v) { Shuffle(random, v, v.size()); }
36 
37 
39 
40  inline emp::vector<size_t> GetPermutation(Random & random, size_t size) {
41  emp::vector<size_t> seq(size);
42  seq[0] = 0;
43  for (size_t i = 1; i < size; i++) {
44  size_t val_pos = random.GetUInt(i+1);
45  seq[i] = seq[val_pos];
46  seq[val_pos] = i;
47  }
48  return seq;
49  }
50 
52 
53  inline void Choose(Random & random, size_t N, size_t K, std::vector<size_t> & choices) {
54  emp_assert (N >= K);
55 
56  choices.resize(K);
57  while (K) {
58  if (N==K || random.P(((double) K)/((double) N))) { choices[--K] = --N; }
59  else --N;
60  }
61  }
62 
63  inline std::vector<size_t> Choose(Random & random, size_t N, size_t K) {
64  std::vector<size_t> choices;
65  Choose(random,N,K,choices);
66  return choices;
67  }
68 
69 
71  inline BitVector RandomBitVector(Random & random, size_t size, double p=0.5)
72  {
73  emp_assert(p >= 0.0 && p <= 1.0);
74  BitVector bits(size);
75  for (size_t i = 0; i < size; i++) bits[i] = random.P(p);
76  return bits;
77  }
78 
80  inline emp::vector<double> RandomDoubleVector(Random & random, size_t size, double min, double max) {
81  emp::vector<double> vals(size);
82  for (double & v : vals) v = random.GetDouble(min, max);
83  return vals;
84  }
85 
87  inline emp::vector<size_t> RandomUIntVector(Random & random, size_t size, size_t min, size_t max) {
88  emp::vector<size_t> vals(size);
89  for (size_t & v : vals) v = random.GetUInt(min, max);
90  return vals;
91  }
92 
94  template <typename T>
95  inline emp::vector<T> RandomVector(Random & random, size_t size, T min, T max) {
96  emp::vector<T> vals(size);
97  for (T & v : vals) v = (T) random.GetDouble((double) min, (double) max);
98  return vals;
99  }
100 
102  inline void RandomizeBitVector(BitVector & bits, Random & random, double p=0.5)
103  {
104  emp_assert(p >= 0.0 && p <= 1.0);
105  for (size_t i = 0; i < bits.size(); i++) bits[i] = random.P(p);
106  }
107 
109  template <typename T>
110  inline void RandomizeVector(emp::vector<T> & vals, Random & random, T min, T max) {
111  for (T & v : vals) v = (T) random.GetDouble((double) min, (double) max);
112  }
113 }
114 
115 #endif
size_t size() const
Function to allow drop-in replacement with std::vector<bool>.
Definition: BitVector.h:765
BitVector RandomBitVector(Random &random, size_t size, double p=0.5)
Generate a random BitVector of the specified size.
Definition: random_utils.h:71
void Shuffle(Random &random, emp::vector< T > &v, size_t max_count)
Definition: random_utils.h:25
A versatile and non-patterned pseudo-random-number generator (Mersenne Twister).
Definition: ce_random.h:52
A drop-in replacement for std::vector<bool>, but with extra bitwise logic features.
Definition: BitVector.h:39
A drop-in replacement for std::vector<bool>, with additional bitwise logic features.
size_t size() const
Definition: vector.h:151
constexpr uint32_t GetUInt(const uint32_t max)
Definition: ce_random.h:191
void RandomizeVector(emp::vector< T > &vals, Random &random, T min, T max)
Generate a random vector in the specified type and range.
Definition: random_utils.h:110
constexpr double GetDouble()
Definition: ce_random.h:166
emp::vector< T > RandomVector(Random &random, size_t size, T min, T max)
Generate a random vector in the specified type and range.
Definition: random_utils.h:95
A versatile and non-patterned pseudo-random-number generator.
If we are in emscripten, make sure to include the header.
Definition: array.h:37
emp::vector< size_t > RandomUIntVector(Random &random, size_t size, size_t min, size_t max)
Generate a random size_t vector in the specified range.
Definition: random_utils.h:87
emp::vector< double > RandomDoubleVector(Random &random, size_t size, double min, double max)
Generate a random double vector in the specified range.
Definition: random_utils.h:80
#define emp_assert(...)
Definition: assert.h:199
emp::vector< size_t > GetPermutation(Random &random, size_t size)
Return an emp::vector<int> numbered 0 through size-1 in a random order.
Definition: random_utils.h:40
constexpr bool P(const double _p)
Definition: ce_random.h:216
void RandomizeBitVector(BitVector &bits, Random &random, double p=0.5)
Generate a random BitVector of the specified size.
Definition: random_utils.h:102
void Choose(Random &random, size_t N, size_t K, std::vector< size_t > &choices)
Choose K positions from N possibilities.
Definition: random_utils.h:53