mrg32k3a#
The combined multiple recursive pseudorandom number generator MRG32k3a.
Description
MRG32k3a engine is a 32-bit combined multiple recursive generator with two components of order 3 [L’Ecuyer99a]. MRG32k3a combined generator meets the requirements for modern RNGs, such as good multidimensional uniformity, or a long period (\(p \approx 2^{191}\)).
Generation algorithm
\(x_n=a_{11} x_{n-1} + a_{12} x_{n-2} + a_{13} x_{n-3}(mod \ m_{1})\)
\(y_n = a_{21} y_{n-1} + a_{22} y_{n-2} + a_{23} (mod \ m_2)\)
\(z_n = x_n - y_n (mod \ m_{1})\)
\(u_n = z_n / m_1\)
\(a_{11} = 0, a_{12} = 1403580, a_{13} = -810728, m_1 = 2^{32} - 209\)
\(a_{21} = 527612, a_{22} = 0, a_{23} = -1370589, m_2 = 2^{32} - 22853\)
class mrg32k3a#
Syntax
namespace oneapi::math::rng::device {
template<std::int32_t VecSize = 1>
class mrg32k3a {
public:
static constexpr std::uint32_t default_seed = 1;
static constexpr std::int32_t vec_size = VecSize;
mrg32k3a();
mrg32k3a(std::uint32_t seed, std::uint64_t offset = 0);
mrg32k3a(std::initializer_list<std::uint32_t> seed, std::uint64_t offset = 0);
mrg32k3a(std::uint32_t seed, std::initializer_list<std::uint64_t> offset);
mrg32k3a(std::initializer_list<std::uint32_t> seed, std::initializer_list<std::uint64_t> offset);
};
}
Class Template Parameters
- VecSize
Describes the size of vector which will be produced by generate function by this engine. VecSize values may be 1, 2, 3, 4, 8, 16 as
sycl::vec
class size. By default VecSize = 1, for this case, a single random number is returned by thegenerate
function.
Class Members
Routine |
Description |
---|---|
Default constructor |
|
Constructor for common seed initialization of the engine and common number of skipped elements |
|
mrg32k3a(std::initializer_list<std::uint32_t> seed, std::uint64_t offset = 0) |
Constructor for extended seed initialization of the engine and common number of skipped elements |
mrg32k3a(std::uint32_t seed, std::initializer_list<std::uint64_t> offset) |
Constructor for common seed initialization of the engine and extended number of skipped elements |
mrg32k3a(std::initializer_list<std::uint32_t> seed, std::initializer_list<std::uint64_t> offset) |
Constructor for extended seed initialization of the engine and extended number of skipped elements |
Constructors
mrg32k3a::mrg32k3a()
mrg32k3a::mrg32k3a(std::uint32_t seed, std::uint64_t offset = 0)
Input Parameters
- seed
The initial conditions of the generator state, assume if \(n = 0: x_{-3} = x_{-2} = x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 1: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 2: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 3: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 4: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = y_{-1} = 1\)
if \(n = 5: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = seed[4] \ mod \ m_2, y_{-1} = 1\)
if \(n \geqslant 6: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = seed[4] \ mod \ m_2, y_{-1} = seed[5] \ mod \ m_2\)
if the values prove to be \(x_{-3} = x_{-2} = x_{-1} = 0\), assume \(x_{-3} = 1\)
if the values prove to be \(y_{-3} = y_{-2} = y_{-1} = 0\), assume \(y_{-3} = 1\).
- offset
Number of skipped elements.
mrg32k3a::mrg32k3a(std::initializer_list<std::uint32_t> seed, std::uint64_t offset = 0)
Input Parameters
- seed
Initial conditions of the engine state.
- offset
Number of skipped elements.
mrg32k3a::mrg32k3a(std::uint32_t seed, std::initializer_list<std::uint64_t> offset)
Input Parameters
- seed
The initial conditions of the generator state, assume if \(n = 0: x_{-3} = x_{-2} = x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 1: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 2: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 3: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = y_{-2} = y_{-1} = 1\)
if \(n = 4: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = y_{-1} = 1\)
if \(n = 5: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = seed[4] \ mod \ m_2, y_{-1} = 1\)
if \(n \geqslant 6: x_{-3} = seed[0] \ mod \ m_1, x_{-2} = seed[1] \ mod \ m_1, x_{-1} = seed[2] \ mod \ m_1\)
\(y_{-3} = seed[3] \ mod \ m_2, y_{-2} = seed[4] \ mod \ m_2, y_{-1} = seed[5] \ mod \ m_2\)
if the values prove to be \(x_{-3} = x_{-2} = x_{-1} = 0\), assume \(x_{-3} = 1\)
if the values prove to be \(y_{-3} = y_{-2} = y_{-1} = 0\), assume \(y_{-3} = 1\).
- offset
Number of skipped elements. Offset is calculated as:
num_to_skip
[0]+num_to_skip
[1]*264 +num_to_skip
[2]* 2128 + … +num_to_skip
[n
-1]*264 *(n
-1).
mrg32k3a::mrg32k3a(std::initializer_list<std::uint32_t> seed, std::initializer_list<std::uint64_t> offset)
Input Parameters
- seed
Initial conditions of the engine state.
- offset
Number of skipped elements. Offset is calculated as:
num_to_skip
[0]+num_to_skip
[1]*264 +num_to_skip
[2]* 2128 + … +num_to_skip
[n
-1]*264 *(n
-1).
Parent topic: Device Engines (Basic Random Number Generators)