std::philox_engine
Defined in header <random>
|
||
template< class UIntType, std::size_t w, std::size_t n, std::size_t r, |
(since C++26) | |
std::philox_engine
is a counter-based random number engine.
Contents |
[edit] Template parameters
UIntType | - | The result type generated by the generator. The effect is undefined if this is not one of unsigned short, unsigned int, unsigned long, or unsigned long long. |
w | - | the word size in bits |
n | - | the word count |
r | - | the round count |
consts | - | the sequence of multipliers and round constants used for generating random numbers |
If any of the following values is not true, the program is ill-formed:
- sizeof...(consts) == n
- n == 2 || n == 4 || n == 8 || n == 16
- 0 < r
- 0 < w && w <= std::numeric_limits<UIntType>::digits
[edit] Generator properties
In the following description, let Q
i denote the ith element of sequence Q, where the subscript starts from zero.
The size of the states of philox_engine
is O(n), each of them consists of four parts:
- A sequence X of n integer values, where each value is in
[
0,
2
w
)
.
- This sequence represents a large unsigned integer counter value Z=∑n-1
j=0X⋅2wj
of n⋅w bits.
- This sequence represents a large unsigned integer counter value Z=∑n-1
- A sequence K of n / 2 keys of type
UIntType
. - A buffer Y of n produced values of type
UIntType
. - An index j in Y buffer.
The transition algorithm of philox_engine
(TA(X
i)) is defined as follows:
- Generates a new sequence of n random values (see below) and stores them in Y.
- Increments the counter Z by 1.
- Resets j to 0.
The generation algorithm of philox_engine
is GA(X
i)=Y
j.
- ↑ In this case, the next generation algorithm call returns the next generated value in the buffer.
- ↑ In this case, the buffer is refreshed, and the next generation algorithm call returns the first value in the new buffer.
[edit] Generating random values
Random values are generated from the following parameters:
- the number of rounds r
- the current counter sequence X
- the key sequence K
- the multiplier sequence M
- the round constant sequence C
The sequences M and C are formed from the values from template parameter pack consts, which represents the M
k and C
k constants as [
M
0,
C
0,
M
1,
C
1,... , ...,
M
n/2-1,
C
n/2-1]
.
Random numbers are generated by the following process:
- Initializes the output sequence S with the elements of X.
- Updates the elements of S for r rounds.
- Replaces the values in the buffer Y with the values in S.
[edit] Updating the output sequence
For each round of update, an intermediate sequence V is initialized with the elements of S in a specified order:
n | V 0 |
V 1 |
V 2 |
V 3 |
V 4 |
V 5 |
V 6 |
V 7 |
V 8 |
V 9 |
V 10 |
V 11 |
V 12 |
V 13 |
V 14 |
V 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | S 0 |
S 1 |
N/A | |||||||||||||
4 | S 0 |
S 3 |
S 2 |
S 1 |
N/A | |||||||||||
8 | S 2 |
S 1 |
S 4 |
S 7 |
S 6 |
S 5 |
S 0 |
S 3 |
N/A | |||||||
16 | S 0 |
S 9 |
S 2 |
S 13 |
S 6 |
S 11 |
S 4 |
S 15 |
S 10 |
S 7 |
S 12 |
S 3 |
S 14 |
S 5 |
S 8 |
S 1 |
Given the following operation notations:
- xor, built-in bitwise XOR.
- mullo, it calcuates the low half of modular multiplication and is defined as mullo(a,b,w)=(a⋅b) mod 2w
. - mulhi, it calcuates the high half of multiplication and is defined as mulhi(a,b,w)=⌊(a⋅b)/2w
⌋.
Let q be the current round number (starting from zero), for each integer k in [
0,
n / 2)
, the elements of the output sequence S are updated as follows:
- X
2⋅k=mullo(V
2⋅k+1,M
k,w) - X
2⋅k+1=mulhi(V
2⋅k+1,M
k,w) xor ((K
k+q⋅C
k) mod 2w
) xor V
2⋅k
[edit] Predefined specializations
The following specializations define the random number engine with two commonly used parameter sets:
Defined in header
<random> | |
Type | Definition |
philox4x32 (C++26)
|
std::philox_engine<std::uint_fast32_t, 32, 4, 10, 0xD2511F53, 0x9E3779B9, 0xCD9E8D57, 0xBB67AE85>
|
philox4x64 (C++26)
|
std::philox_engine<std::uint_fast64_t, 64, 4, 10, 0xD2E7470EE14C6C93, 0x9E3779B97F4A7C15, 0xCA5A826395121157, 0xBB67AE8584CAA73B>
|
[edit] Nested types
Type | Definition |
result_type
|
UIntType
|
[edit] Data members
constexpr std::size_t word_size [static] |
w (public static member constant) |
constexpr std::size_t word_count [static] |
n (public static member constant) |
constexpr std::size_t round_count [static] |
r (public static member constant) |
constexpr std::array<result_type, word_count / 2> multipliers [static] |
the multiplier sequence M (public static member constant) |
constexpr std::array<result_type, word_count / 2> round_consts [static] |
the round constant sequence C (public static member constant) |
constexpr std::uint_least32_t default_seed [static] |
20111115u (public static member constant) |
[edit] Member functions
Construction and Seeding | |
(C++26) |
constructs the engine (public member function) |
(C++26) |
sets the current state of the engine (public member function) |
(C++26) |
sets the current counter of the engine (public member function) |
Generation | |
(C++26) |
advances the engine's state and returns the generated value (public member function) |
(C++26) |
advances the engine's state by a specified amount (public member function) |
Characteristics | |
[static] (C++26) |
gets the smallest possible value in the output range (public static member function) |
[static] (C++26) |
gets the largest possible value in the output range (public static member function) |
[edit] Non-member functions
(C++26) |
compares the internal states of two pseudo-random number engines (function) |
(C++26) |
performs stream input and output on pseudo-random number engine (function template) |
[edit] Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_philox_engine |
202406L | (C++26) | std::philox_engine
|
[edit] Example
This section is incomplete Reason: no example |