std::philox_engine
| Definiert in Header <random> |
||
| template< class UIntType, std::size_t w, std::size_t n, std::size_t r, |
(seit C++26) | |
std::philox_engine ist eine zählerbasierte Zufallszahlenerzeuger-Engine.
Inhalt |
[edit] Template-Parameter
| UIntType | - | Der vom Generator erzeugte Ergebnistyp. Das Verhalten ist undefiniert, wenn dies nicht einer der folgenden Typen ist: unsigned short, unsigned int, unsigned long oder unsigned long long. |
| w | - | die Wortgröße in Bits |
| n | - | die Wortanzahl |
| r | - | die Rundenzahl |
| consts | - | die Sequenz von Multiplikatoren und Rundkonstanten, die zur Generierung von Zufallszahlen verwendet werden |
Wenn einer der folgenden Werte nicht true ist, ist das Programm schlecht formuliert
- sizeof...(consts) = n
- n = 2 || n = 4
- 0 < r
- 0 < w && w <= std::numeric_limits<UIntType<::digits
[edit] Generator-Eigenschaften
In der folgenden Beschreibung bezeichnet Qi das i-te Element der Sequenz Q, wobei der Index bei Null beginnt.
Die Größe des Zustands von philox_engine ist O(n), jeder dieser Teile besteht aus vier Teilen
- Eine Sequenz X von n Ganzzahlwerten, wobei jeder Wert im Bereich
[0,2w)liegt.
- Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahlzählerwert Z=∑n-1
j=0X⋅2wj
von n⋅w Bits.
- Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahlzählerwert Z=∑n-1
- Eine Sequenz K von n / 2 Schlüsseln vom Typ
UIntType. - Ein Puffer Y von n generierten Werten vom Typ
UIntType. - Ein Index j im Puffer Y.
Der Übergangsalgorithmus von philox_engine (TA(Xi)) ist wie folgt definiert:
- Wenn j nicht n - 1 ist, wird j um 1 inkrementiert.[1]
- Wenn j n - 1 ist, werden folgende Operationen ausgeführt:[2]
- Generiert eine neue Sequenz von n Zufallswerten (siehe unten) und speichert sie in Y.
- Inkrementiert den Zähler Z um 1.
- Setzt j auf 0 zurück.
Der Generierungsalgorithmus von philox_engine ist GA(Xi)=Yj.
- ↑ In diesem Fall gibt der nächste Aufruf des Generierungsalgorithmus den nächsten generierten Wert im Puffer zurück.
- ↑ In diesem Fall wird der Puffer aktualisiert und der nächste Aufruf des Generierungsalgorithmus gibt den ersten Wert im neuen Puffer zurück.
[edit] Generieren von Zufallswerten
Zufallswerte werden aus den folgenden Parametern generiert:
- die Anzahl der Runden r
- die aktuelle Zählersequenz X
- die Schlüsselsequenz K
- die Multiplikatorensequenz M
- die Rundkonstanten-Sequenz C
Die Sequenzen M und C werden aus den Werten des Template-Parameter-Packs consts gebildet, das die Mk und Ck Konstanten repräsentiert als [M0, C0, M1, C1,... , ..., Mn/2-1, Cn/2-1].
Zufallszahlen werden durch den folgenden Prozess generiert:
- Initialisiert die Ausgabesequenz S mit den Elementen von X.
- Aktualisiert die Elemente von S für r Runden.
- Ersetzt die Werte im Puffer Y durch die Werte in S.
[edit] Aktualisieren der Ausgabesequenz
Für jede Update-Runde wird eine Zwischensequenz V mit den Elementen von S in einer bestimmten Reihenfolge initialisiert:
| n | V0 | V1 | V2 | V3 |
|---|---|---|---|---|
| 2 | S0 | S1 | N/A | |
| 4 | S2 | S1 | S0 | S3 |
Gegeben seien folgende Operationsnotationen:
- xor, eingebautes bitweises XOR.
- mullo, berechnet die untere Hälfte der modularen Multiplikation und ist definiert als mullo(a,b,w)=(a⋅b) mod 2w
. - mulhi, berechnet die obere Hälfte der Multiplikation und ist definiert als mulhi(a,b,w)=⌊(a⋅b)/2w
⌋.
Sei q die aktuelle Rundennummer (beginnend bei Null). Für jede Ganzzahl k im Bereich [0, n / 2) werden die Elemente der Ausgabesequenz S wie folgt aktualisiert:
- X2⋅k=mulhi(V2⋅k,Mk,w) xor ((Kk+q⋅Ck) mod 2w
) xor V2⋅k+1 - X2⋅k+1=mullo(V2⋅k,Mk,w)
[edit] Vordefinierte Spezialisierungen
Die folgenden Spezialisierungen definieren die Zufallszahl-Engine mit zwei häufig verwendeten Parametersätzen:
| Definiert in Header
<random> | |
| Typ | Definition |
philox4x32 (C++26) |
std::philox_engine<std::uint_fast32_t, 32, 4, 10, 0xCD9E8D57, 0x9E3779B9, 0xD2511F53, 0xBB67AE85> |
philox4x64 (C++26) |
std::philox_engine<std::uint_fast64_t, 64, 4, 10, 0xCA5A826395121157, 0x9E3779B97F4A7C15, 0xD2E7470EE14C6C93, 0xBB67AE8584CAA73B> |
[edit] Verschachtelte Typen
| Typ | Definition |
result_type
|
UIntType
|
[edit] Datenmember
| constexpr std::size_t word_size [static] |
w (öffentliche statische Member-Konstante) |
| constexpr std::size_t word_count [static] |
n (öffentliche statische Member-Konstante) |
| constexpr std::size_t round_count [static] |
r (öffentliche statische Member-Konstante) |
| constexpr std::array<result_type, word_count / 2<> multipliers [static] |
die Multiplikatorensequenz M (öffentliche statische Member-Konstante) |
| constexpr std::array<result_type, word_count / 2<> round_consts [static] |
die Rundkonstantensequenz C (öffentliche statische Member-Konstante) |
| constexpr std::uint_least32_t default_seed [static] |
20111115u (öffentliche statische Member-Konstante) |
[edit] Memberfunktionen
Konstruktion und Initialisierung | |
| konstruiert die Engine (public member function) [[Bearbeiten]] | |
| setzt den aktuellen Zustand der Engine (public member function) [[Bearbeiten]] | |
| setzt den aktuellen Zähler der Engine (public member function) | |
Generierung | |
| verschiebt den Zustand der Engine und gibt den generierten Wert zurück (public member function) [[Bearbeiten]] | |
| verschiebt den Zustand der Engine um einen angegebenen Betrag (public member function) [[Bearbeiten]] | |
Eigenschaften des Generators | |
| [static] |
liefert den kleinstmöglichen Wert im Ausgabebereich (public static member function) [[Bearbeiten]] |
| [static] |
liefert den größtmöglichen Wert im Ausgabebereich (public static member function) [[Bearbeiten]] |
[edit] Nicht-Member-Funktionen
| (C++26) |
vergleicht die internen Zustände zweier Pseudozufallszahlengeneratoren (function) |
| (C++26) |
führt Stream-Ein- und -Ausgabe auf Pseudo-Zufallszahlengeneratoren durch (function template) |
[edit] Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_philox_engine |
202406L |
(C++26) | std::philox_engine
|
[edit] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |