45#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_RANDOM_INL
46#define LASS_GUARDIAN_OF_INCLUSION_NUM_RANDOM_INL
51#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
53# pragma warning(disable: 4996)
55# pragma GCC diagnostic push
56# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
80 return rand() % supremum;
85template <
typename OutputIterator>
86OutputIterator RandomStandard::getState(OutputIterator first)
const
93template <
typename InputIterator>
94void RandomStandard::setState([[maybe_unused]] InputIterator first, [[maybe_unused]] InputIterator last)
96 LASS_ASSERT(first == last);
108 return (*
this)() % supremum;
113template <
typename OutputIterator>
114OutputIterator RandomParkMiller::getState(OutputIterator first)
const
122template <
typename InputIterator>
123void RandomParkMiller::setState(InputIterator first, InputIterator LASS_UNUSED(last))
125 LASS_ASSERT(first != last);
127 LASS_ASSERT(first == last);
140template <
typename ForwardIterator>
154template <
typename ForwardIterator>
157 LASS_META_ASSERT(
sizeof(
TValue) * lass::bitsPerByte == 32, if_TValue_is_32_bits_then_the_wordMasks_are_not_necessary);
161 const size_t keySize =
static_cast<size_t>(std::distance(first, last));
162 LASS_ASSERT(keySize < num::NumTraits<TValue>::max);
166 ForwardIterator key = first;
167 for (
size_t k = std::max<size_t>(stateSize_, keySize); k > 0; --k)
169 state_[i] = (state_[i] ^ ((state_[i - 1] ^ (state_[i - 1] >> 30)) * 1664525)) + *key + j;
175 state_[0] = state_[stateSize_ - 1];
187 for (
size_t k = stateSize_ - 1; k > 0; --k)
189 state_[i] = (state_[i] ^ ((state_[i - 1] ^ (state_[i - 1] >> 30)) * 1566083941)) - i;
194 state_[0] = state_[stateSize_ - 1];
199 state_[0] = 0x80000000;
209 return (*
this)() % supremum;
214template <
typename OutputIterator>
215OutputIterator RandomMT19937::getState(OutputIterator first)
const
218 return std::copy(state_, state_ + stateSize_, first);
223template <
typename InputIterator>
224void RandomMT19937::setState(InputIterator first, InputIterator last)
226 LASS_ASSERT(first != last);
228 LASS_ASSERT(first != last);
229 [[maybe_unused]]
result_type* end = std::copy(first, last, state_);
230 LASS_ASSERT(end == state_ + stateSize_);
239#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
242# pragma GCC diagnostic pop
num::Tuint32 TValue
type of return value.
void seed(result_type seed)
initializes with a seed.
result_type operator()()
draw a random number
num::Tuint32 result_type
type of return value.
RandomMT19937()
default constructor.
num::Tuint32 TValue
type of return value.
result_type operator()()
draw a random number
num::Tuint32 result_type
type of return value.
int TValue
type of return value.
result_type operator()() const
draw a random number
int result_type
type of return value.
numeric types and traits.
Library for Assembled Shared Sources.