Namensräume
Varianten
Aktionen

std::philox_engine

Von cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
 
Definiert in Header <random>
template<

    class UIntType, std::size_t w, std::size_t n, std::size_t r,
   UIntType... consts
>

class philox_engine;
(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 [02w
    )
    liegt.
  • Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahlzählerwert Z=∑n-1
    j=0
    X⋅2wj
    von n⋅w Bits.
  • 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]
  1. Generiert eine neue Sequenz von n Zufallswerten (siehe unten) und speichert sie in Y.
  2. Inkrementiert den Zähler Z um 1.
  3. Setzt j auf 0 zurück.

Der Generierungsalgorithmus von philox_engine ist GA(Xi)=Yj.

  1. In diesem Fall gibt der nächste Aufruf des Generierungsalgorithmus den nächsten generierten Wert im Puffer zurück.
  2. 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:

  1. Initialisiert die Ausgabesequenz S mit den Elementen von X.
  2. Aktualisiert die Elemente von S für r Runden.
  3. 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 [0n / 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>[bearbeiten]
philox4x64 (C++26) std::philox_engine<std::uint_fast64_t, 64, 4, 10,
                   0xCA5A826395121157, 0x9E3779B97F4A7C15,
                   0xD2E7470EE14C6C93, 0xBB67AE8584CAA73B>[bearbeiten]

[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) [edit]
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

vergleicht die internen Zustände zweier Pseudozufallszahlengeneratoren
(function) [bearbeiten]
führt Stream-Ein- und -Ausgabe auf Pseudo-Zufallszahlengeneratoren durch
(function template) [edit]

[edit] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

[edit] Beispiel