std:: philox_engine
|
Definiert im 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 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:
- sizeof... ( consts ) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
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 ,2w
)liegt.
-
-
Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahl-Zählerwert
Z=∑
n-1
j=0 X⋅2 wj
von n⋅w Bits.
-
Diese Sequenz repräsentiert einen großen vorzeichenlosen Ganzzahl-Zählerwert
Z=∑
n-1
-
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]
- Erzeugt eine neue Sequenz von n Zufallswerten (siehe unten) und speichert sie in Y .
- Erhöht den Zähler Z um 1 .
- Setzt j auf 0 zurück.
Der
Generierungsalgorithmus
von
philox_engine
ist
GA(X
i
)=Y
j
.
- ↑ In diesem Fall gibt der nächste Generierungsalgorithmus-Aufruf den nächsten generierten Wert im Buffer zurück.
- ↑ 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:
- 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 .
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)
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) |
|
(C++26)
|
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
|
Dieser Abschnitt ist unvollständig
Grund: Kein Beispiel |