Namespaces
Variants

std:: philox_engine

From cppreference.net
Definiert im 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 Zufallszahlen-Engine.

Inhaltsverzeichnis

Template-Parameter

UIntType - Der vom Generator erzeugte Ergebnistyp. Das Verhalten ist undefiniert, falls dies nicht einer der Typen unsigned short , unsigned int , unsigned long , oder unsigned long long ist.
w - die Wortgröße in Bits
n - die Wortanzahl
r - die Rundenzahl
consts - die Folge von Multiplikatoren und Rundungskonstanten zur Erzeugung von Zufallszahlen

Wenn einer der folgenden Werte nicht true ist, ist das Programm fehlerhaft:

Generatoreigenschaften

In der folgenden Beschreibung sei Q i das i te Element der Sequenz Q , wobei der Index bei null beginnt.

Die Größe der Zustände von philox_engine beträgt O(n) , jeder davon besteht aus vier Teilen:

  • Eine Sequenz X von n ganzzahligen Werten, wobei jeder Wert im Bereich [ 0 , 2 w
    )
    liegt.
  • Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahl-Zählerwert Z=∑ n-1
    j=0
    X⋅2 wj
    von n⋅w Bits.
  • Eine Sequenz K von n / 2 Schlüsseln des Typs UIntType .
  • Ein Puffer Y von n produzierten Werten des Typs UIntType .
  • Ein Index j im Y -Puffer.

Der Übergangsalgorithmus von philox_engine ( TA(X i ) ) ist wie folgt definiert:

  • Wenn j nicht n - 1 ist, erhöht j um 1 . [1]
  • Wenn j gleich n - 1 ist, führt die folgenden Operationen aus: [2]
  1. Erzeugt eine neue Sequenz von n Zufallswerten (siehe unten) und speichert sie in Y .
  2. Erhöht den Zähler Z um 1 .
  3. Setzt j auf 0 zurück.

Der Generierungsalgorithmus von philox_engine ist GA(X i )=Y j .

  1. In diesem Fall gibt der nächste Generierungsalgorithmus-Aufruf den nächsten generierten Wert im Buffer zurück.
  2. In diesem Fall wird der Buffer aktualisiert, und der nächste Generierungsalgorithmus-Aufruf gibt den ersten Wert im neuen Buffer zurück.

Erzeugung von Zufallswerten

Zufällige Werte werden aus den folgenden Parametern generiert:

  • die Anzahl der Runden r
  • die aktuelle Zählersequenz X
  • die Schlüsselfolge K
  • die Multiplikatorfolge M
  • die Rundkonstantenfolge C

Die Sequenzen M und C werden aus den Werten des Template-Parameterpacks consts gebildet, welches die M k - und C k -Konstanten als [ M 0 , C 0 , M 1 , C 1 ,... , ..., M n/2-1 , C n/2-1 ] darstellt.

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 .

Aktualisieren der Ausgabesequenz

Für jede Aktualisierungsrunde wird eine Zwischensequenz V mit den Elementen von S in einer bestimmten Reihenfolge initialisiert:

n V 0 V 1 V 2 V 3
2 S 0 S 1 Nicht verfügbar
4 S 2 S 1 S 0 S 3

Gegeben sind die folgenden Operationsnotationen:

  • xor , eingebauter bitweiser XOR-Operator .
  • mullo , berechnet die niederwertige Hälfte der modularen Multiplikation und ist definiert als mullo(a,b,w)=(a⋅b) mod 2 w
    .
  • mulhi , berechnet die höherwertige Hälfte der Multiplikation und ist definiert als mulhi(a,b,w)=⌊(a⋅b)/2 w
    .

Sei q die aktuelle Rundenanzahl (beginnend bei null), für jede ganze Zahl k in [ 0 , n / 2 ) werden die Elemente der Ausgabesequenz S wie folgt aktualisiert:

  • X 2⋅k =mulhi(V 2⋅k ,M k ,w) xor ((K k +q⋅C k ) mod 2 w
    ) xor V 2⋅k+1
  • X 2⋅k+1 =mullo(V 2⋅k ,M k ,w)
*Hinweis: Der mathematische Formeltext innerhalb der -Tags wurde gemäß den Anforderungen nicht übersetzt, da er als Code/Mathematik-Inhalt betrachtet wird. Die HTML-Struktur und alle Tags wurden unverändert beibehalten.*

Vordefinierte Spezialisierungen

Die folgenden Spezialisierungen definieren die Zufallszahlen-Engine mit zwei häufig verwendeten Parametersätzen:

Definiert im 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 >

Verschachtelte Typen

Typ Definition
result_type UIntType

Datenmitglieder

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 Multiplikatorsequenz M
(öffentliche statische Member-Konstante)
constexpr std:: array < result_type, word_count / 2 > round_consts
[static]
die Rundungs-Konstanten-Sequenz C
(öffentliche statische Member-Konstante)
constexpr std::uint_least32_t default_seed
[static]
20111115u
(öffentliche statische Member-Konstante)

Memberfunktionen

Konstruktion und Initialisierung
konstruiert die Engine
(öffentliche Elementfunktion)
setzt den aktuellen Zustand der Engine
(öffentliche Elementfunktion)
setzt den aktuellen Zähler der Engine
(öffentliche Elementfunktion)
Generierung
bewegt den Zustand der Engine vor und gibt den generierten Wert zurück
(öffentliche Elementfunktion)
bewegt den Zustand der Engine um einen bestimmten Betrag vor
(öffentliche Elementfunktion)
Eigenschaften
[static]
ermittelt den kleinstmöglichen Wert im Ausgabebereich
(öffentliche statische Elementfunktion)
[static]
ermittelt den größtmöglichen Wert im Ausgabebereich
(öffentliche statische Elementfunktion)

Nicht-Member-Funktionen

(C++26)
vergleicht die internen Zustände zweier Pseudozufallszahlengeneratoren
(Funktion)
führt Stream-Eingabe und -Ausgabe auf Pseudozufallszahlengenerator durch
(Funktionsschablone)

Hinweise

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

Beispiel