https://mooseframework.inl.gov
Classes | Public Member Functions | Private Attributes | List of all members
MooseRandomStateless Class Reference

A deterministic, indexable random number generator built on top of the randistrs library. More...

#include <MooseRandomStateless.h>

Classes

class  Generator
 Template class wrapping a single random number generator function. More...
 

Public Member Functions

 MooseRandomStateless (const MooseRandomStateless &)=delete
 Deleted copy constructor and assignment to prevent deep-copy of mutable state. More...
 
MooseRandomStatelessoperator= (const MooseRandomStateless &)=delete
 
 MooseRandomStateless (unsigned int seed)
 Construct a new MooseRandomStateless with a given seed. More...
 
unsigned int getSeed () const
 Get the seed value used to initialize this handler's RNGs. More...
 
std::size_t getAdvanceCount () const
 Get the amount that the RNGs have advanced by advance(count) calls. More...
 
Real rand (std::size_t n) const
 Return the n-th uniform Real random number in [0, 1). More...
 
unsigned int randl (std::size_t n) const
 Return the n-th unsigned integer from the full 32-bit uniform range. More...
 
unsigned int randl (std::size_t n, unsigned int lower, unsigned int upper) const
 Return the n-th bounded integer random number in [lower, upper). More...
 
void advance (std::size_t count)
 Advance all generators by the specified number. More...
 

Private Attributes

const unsigned int _seed
 Seed shared by all internal generators. More...
 
Generator< Real_rand_generator
 Uniform Real [0, 1) More...
 
Generator< unsigned int_randl_generator
 Uniform uint32. More...
 
std::unordered_map< unsigned int, Generator< unsigned int > > _randlb_generators
 Bounded uniform uint32 (indexed based on bounding range) More...
 
std::size_t _advance_count = 0
 The number of counts the generators have advanced This needs to be kept around for generation of new randlb generators. More...
 

Detailed Description

A deterministic, indexable random number generator built on top of the randistrs library.

This class provides seed-able random generators that can produce the n-th sample in a reproducible sequence without maintaining large generator states between calls. It achieves this by keeping a small cached generator state for efficient sequential access, while still allowing deterministic random access to any index n via recomputation.

Usage Example:

Real x = rng.rand(5); // 6th random number
unsigned int y = rng.randl(10); // 11th integer in full 32-bit range
unsigned int z = rng.randl(7, 0, 100); // 8th integer in [0, 100)
rng.advance(100); // Advance cache by 100 for speedier access
Real x = rng.rand(0, 17); // The 117th number in the sequence

Thread Safety:

Performance:

Design Overview:

Implementation Notes:

Definition at line 81 of file MooseRandomStateless.h.

Constructor & Destructor Documentation

◆ MooseRandomStateless() [1/2]

MooseRandomStateless::MooseRandomStateless ( const MooseRandomStateless )
delete

Deleted copy constructor and assignment to prevent deep-copy of mutable state.

◆ MooseRandomStateless() [2/2]

MooseRandomStateless::MooseRandomStateless ( unsigned int  seed)
inline

Construct a new MooseRandomStateless with a given seed.

Initializes internal generators for real and integer distributions.

Parameters
seedBase seed value for all RNGs in this handler

Definition at line 95 of file MooseRandomStateless.h.

96  : _seed(seed), _rand_generator(mts_ldrand, seed), _randl_generator(mts_lrand, seed)
97  {
98  }
Generator< Real > _rand_generator
Uniform Real [0, 1)
Generator< unsigned int > _randl_generator
Uniform uint32.
const unsigned int _seed
Seed shared by all internal generators.

Member Function Documentation

◆ advance()

void MooseRandomStateless::advance ( std::size_t  count)
inline

Advance all generators by the specified number.

Parameters
countThe number of calls to advance.

Definition at line 162 of file MooseRandomStateless.h.

Referenced by dataLoad().

163  {
164  _rand_generator.advance(count);
165  _randl_generator.advance(count);
166  for (auto & [range, gen] : _randlb_generators)
167  gen.advance(count);
168  _advance_count += count;
169  }
Generator< Real > _rand_generator
Uniform Real [0, 1)
void advance(std::size_t count)
Advance the internal RNG state by a fixed count.
std::size_t _advance_count
The number of counts the generators have advanced This needs to be kept around for generation of new ...
Generator< unsigned int > _randl_generator
Uniform uint32.
std::unordered_map< unsigned int, Generator< unsigned int > > _randlb_generators
Bounded uniform uint32 (indexed based on bounding range)

◆ getAdvanceCount()

std::size_t MooseRandomStateless::getAdvanceCount ( ) const
inline

Get the amount that the RNGs have advanced by advance(count) calls.

Returns
std::size_t

Definition at line 112 of file MooseRandomStateless.h.

Referenced by dataStore().

112 { return _advance_count; }
std::size_t _advance_count
The number of counts the generators have advanced This needs to be kept around for generation of new ...

◆ getSeed()

unsigned int MooseRandomStateless::getSeed ( ) const
inline

Get the seed value used to initialize this handler's RNGs.

Returns
unsigned int

Definition at line 105 of file MooseRandomStateless.h.

105 { return _seed; }
const unsigned int _seed
Seed shared by all internal generators.

◆ operator=()

MooseRandomStateless& MooseRandomStateless::operator= ( const MooseRandomStateless )
delete

◆ rand()

Real MooseRandomStateless::rand ( std::size_t  n) const
inline

Return the n-th uniform Real random number in [0, 1).

Uses the cached state for sequential access; otherwise, recomputes from seed.

Parameters
n0-based index of the random number to generate
Returns
Random Real number in [0, 1)

Definition at line 122 of file MooseRandomStateless.h.

122 { return _rand_generator.evaluate(n); }
Generator< Real > _rand_generator
Uniform Real [0, 1)
T evaluate(std::size_t n) const
Evaluate the n-th random number in the sequence.

◆ randl() [1/2]

unsigned int MooseRandomStateless::randl ( std::size_t  n) const
inline

Return the n-th unsigned integer from the full 32-bit uniform range.

This is useful for generating seeds for new generators.

Parameters
n0-based index of the random number to generate
Returns
Unsigned integer sampled uniformly in [0, 2^32)

Definition at line 131 of file MooseRandomStateless.h.

131 { return _randl_generator.evaluate(n); }
Generator< unsigned int > _randl_generator
Uniform uint32.
T evaluate(std::size_t n) const
Evaluate the n-th random number in the sequence.

◆ randl() [2/2]

unsigned int MooseRandomStateless::randl ( std::size_t  n,
unsigned int  lower,
unsigned int  upper 
) const
inline

Return the n-th bounded integer random number in [lower, upper).

Uses a cached generator per unique range.

Parameters
n0-based index of the random number to generate
lowerLower bound (inclusive)
upperUpper bound (exclusive)
Returns
Unsigned integer sampled uniformly in [lower, upper)

Definition at line 143 of file MooseRandomStateless.h.

144  {
145  mooseAssert(upper >= lower, "randl: upper < lower");
146  const auto range = upper - lower;
147 
148  auto [it, is_new] = _randlb_generators.try_emplace(
149  range, [&range](mt_state * state) { return rds_iuniform(state, 0, range); }, _seed);
150 
151  if (is_new)
152  it->second.advance(_advance_count);
153 
154  return lower + it->second.evaluate(n);
155  }
std::size_t _advance_count
The number of counts the generators have advanced This needs to be kept around for generation of new ...
const unsigned int _seed
Seed shared by all internal generators.
std::unordered_map< unsigned int, Generator< unsigned int > > _randlb_generators
Bounded uniform uint32 (indexed based on bounding range)

Member Data Documentation

◆ _advance_count

std::size_t MooseRandomStateless::_advance_count = 0
private

The number of counts the generators have advanced This needs to be kept around for generation of new randlb generators.

Definition at line 268 of file MooseRandomStateless.h.

Referenced by advance(), getAdvanceCount(), and randl().

◆ _rand_generator

Generator<Real> MooseRandomStateless::_rand_generator
private

Uniform Real [0, 1)

Definition at line 260 of file MooseRandomStateless.h.

Referenced by advance(), and rand().

◆ _randl_generator

Generator<unsigned int> MooseRandomStateless::_randl_generator
private

Uniform uint32.

Definition at line 262 of file MooseRandomStateless.h.

Referenced by advance(), and randl().

◆ _randlb_generators

std::unordered_map<unsigned int, Generator<unsigned int> > MooseRandomStateless::_randlb_generators
mutableprivate

Bounded uniform uint32 (indexed based on bounding range)

Definition at line 264 of file MooseRandomStateless.h.

Referenced by advance(), and randl().

◆ _seed

const unsigned int MooseRandomStateless::_seed
private

Seed shared by all internal generators.

Definition at line 258 of file MooseRandomStateless.h.

Referenced by getSeed(), and randl().


The documentation for this class was generated from the following file: