tgen
Loading...
Searching...
No Matches
General Operations

Operations for basic number generation and basic random operations. More...

Classes

struct  tgen::print
 Printer helper for standard types. More...

Macros

#define tgen_ensure(cond, ...)
 Ensures condition is true.

Functions

template<typename T>
tgen::next (T l, T r)
 Returns a random number in [l, r].
template<typename It>
void tgen::shuffle (It first, It last)
 Shuffles range inplace, for random_access_iterator.
template<typename C, std::enable_if_t<!_detail::is_associative_container< C >::value and !_detail::is_generator_instance< C >::value, int > = 0>
tgen::shuffled (const C &container)
 Shuffles a container.
template<typename It>
It::value_type tgen::any (It first, It last)
 Choses a random element from iterator range.
template<typename C, std::enable_if_t<!_detail::is_generator_instance< C >::value, int > = 0>
C::value_type tgen::any (const C &container)
 Choses a random element from container.
template<typename C, std::enable_if_t<!_detail::is_generator_instance< C >::value, int > = 0>
tgen::choose (int k, const C &container)
 Chooses elements from container, as in a subsequence fixed length.

Detailed Description

Operations for basic number generation and basic random operations.

Examples

// Random number from 10 to 20.
int size = tgen::next(10, 20);
tgen_ensure(size <= 20);
// Several numbers in {5, 10, 15, 20}.
std::vector<int> v(size);
for (int& i : v) i = tgen::any({5, 10, 15, 20});
// Shuffles the numbers.
tgen::shuffle(v.begin(), v.end());
// Choses a subsequence of length 5.
v = tgen::choose(5, v);
void shuffle(It first, It last)
Shuffles range inplace, for random_access_iterator.
Definition tgen.h:316
It::value_type any(It first, It last)
Choses a random element from iterator range.
Definition tgen.h:359
T next(T l, T r)
Returns a random number in [l, r].
Definition tgen.h:302
#define tgen_ensure(cond,...)
Ensures condition is true.
Definition tgen.h:87
C choose(int k, const C &container)
Chooses elements from container, as in a subsequence fixed length.
Definition tgen.h:390

Macro Definition Documentation

◆ tgen_ensure

#define tgen_ensure ( cond,
... )

Ensures condition is true.

Parameters
condCondition to me ensured.
...Empty or a string with an error message.
Exceptions
std::runtime_errorif cond is not true.

Examples

// Without error message:
tgen_ensure(a == b);
// With error message:
tgen_ensure(a == b, "values must be the same");

Definition at line 87 of file tgen.h.

Function Documentation

◆ any() [1/2]

template<typename C, std::enable_if_t<!_detail::is_generator_instance< C >::value, int > = 0>
C::value_type tgen::any ( const C & container)

Choses a random element from container.

Parameters
containerContainer to choose from.

Also works with std::initializer_list.

Returns
A uniformly random element from container.

Complexity

O(1) for random_access_iterator, O(|container|) otherwise.

Examples

std::vector<int> v = {1, 2, 3, 4, 5};
int value = tgen::any(v);

Definition at line 370 of file tgen.h.

◆ any() [2/2]

template<typename It>
It::value_type tgen::any ( It first,
It last )

Choses a random element from iterator range.

Parameters
firstFirst iterator of range.
lastFirst iterator outside of range.
Returns
A uniformly random element from the range [first, last).

Complexity

O(1) for random_access_iterator, O(|last - first|) otherwise.

Examples

std::set<int> st = {1, 2, 3, 4, 5};
int value = tgen::any(st.begin(), st.end());

Definition at line 359 of file tgen.h.

◆ choose()

template<typename C, std::enable_if_t<!_detail::is_generator_instance< C >::value, int > = 0>
C tgen::choose ( int k,
const C & container )

Chooses elements from container, as in a subsequence fixed length.

Parameters
kNumber of elements to be chosen.
containerContainer to choose from.

Also works with std::initializer_list.

Returns
A uniformly random subsequence of length k.

Complexity

O(|container|).

Examples

std::vector<int> v = {1, 2, 3, 4, 5};
v = tgen::choose(3, v); // Chooses 3 elements from v.

Definition at line 390 of file tgen.h.

◆ next()

template<typename T>
T tgen::next ( T l,
T r )

Returns a random number in [l, r].

Template Parameters
Ttype to be generated. Should be an arithmetic type: int, double, long long, char, etc.
Parameters
lLeft endpoint of the range.
rLight endpoint of the range.
Returns
A random number in [l, r], chosen uniformly.

Complexity

O(1).

Examples

// Random value from 1 to 10.
int value = tgen::next(1, 10);

Definition at line 302 of file tgen.h.

◆ shuffle()

template<typename It>
void tgen::shuffle ( It first,
It last )

Shuffles range inplace, for random_access_iterator.

Parameters
firstFirst iterator of range.
lastFirst iterator outside of range.

Shuffles [first, last) uniformly inplace. Works for std::vector, std::string, etc, but not std::set. For those, use tgen::shuffled(container).

Complexity

O(|last - first|).

Examples

std::vector<int> v = {1, 2, 3, 4, 5};
tgen::shuffle(v.begin(), v.end());

Definition at line 316 of file tgen.h.

◆ shuffled()

template<typename C, std::enable_if_t<!_detail::is_associative_container< C >::value and !_detail::is_generator_instance< C >::value, int > = 0>
C tgen::shuffled ( const C & container)
nodiscard

Shuffles a container.

Parameters
containerContainer to be shuffled.

Works for containers and std::initializer_list. If container is ordered (std::set, etc) or std::initializer_list, returns a std::vector (implemented in a different function).

Returns
The shuffled container.

Complexity

O(|container|).

Examples

std::vector<int> st = {1, 2, 3, 4, 5};
st = tgen::shuffled(st);
st = tgen::shuffled({1, 2, 3});
st = tgen::shuffled(std::set<int>({1, 2, 3}));
C shuffled(const C &container)
Shuffles a container.
Definition tgen.h:330

Definition at line 330 of file tgen.h.