std:: philox_engine
|
Défini dans l'en-tête
<random>
|
||
|
template
<
class
UIntType,
std::
size_t
w,
std::
size_t
n,
std::
size_t
r,
|
(depuis C++26) | |
std::philox_engine
est un générateur de nombres aléatoires basé sur un compteur.
Table des matières |
Paramètres du modèle
| UIntType | - | Le type de résultat généré par le générateur. L'effet est indéfini si ce n'est pas l'un des unsigned short , unsigned int , unsigned long , ou unsigned long long . |
| w | - | la taille du mot en bits |
| n | - | le nombre de mots |
| r | - | le nombre de tours |
| consts | - | la séquence de multiplicateurs et de constantes de tour utilisée pour générer des nombres aléatoires |
Si l'une des valeurs suivantes n'est pas true , le programme est mal formé :
- sizeof... ( consts ) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
Propriétés du générateur
Dans la description suivante, soit Q i désigne le i ième élément de la séquence Q , où l'indice commence à zéro.
La
taille
des états du
philox_engine
est
O(n)
, chacun d'eux est constitué de quatre parties :
-
Une séquence
X
de
n
valeurs entières, où chaque valeur est dans
[ 0 ,2w
).
-
-
Cette séquence représente une valeur de compteur entier non signé de grande taille
Z=∑
n-1
j=0 X⋅2 wj
de n⋅w bits.
-
Cette séquence représente une valeur de compteur entier non signé de grande taille
Z=∑
n-1
-
Une séquence
K
de
n
/
2
clés de type
UIntType. -
Un tampon
Y
de
n
valeurs produites de type
UIntType. - Un index j dans le tampon Y .
L'
algorithme de transition
de
philox_engine
(
TA(X
i
)
) est défini comme suit :
- Si j n'est pas n - 1 , incrémente j de 1 . [1]
- Si j est n - 1 , effectue les opérations suivantes : [2]
- Génère une nouvelle séquence de n valeurs aléatoires (voir ci-dessous) et les stocke dans Y .
- Incrémente le compteur Z de 1 .
- Réinitialise j à 0 .
L'
algorithme de génération
de
philox_engine
est
GA(X
i
)=Y
j
.
- ↑ Dans ce cas, l'appel de l'algorithme de génération suivante retourne la prochaine valeur générée dans le tampon.
- ↑ Dans ce cas, le tampon est actualisé, et l'appel de l'algorithme de génération suivante retourne la première valeur dans le nouveau tampon.
Génération de valeurs aléatoires
Les valeurs aléatoires sont générées à partir des paramètres suivants :
- le nombre de tours r
- la séquence de compteur actuelle X
- la séquence de clé K
- la séquence de multiplicateur M
- la séquence de constantes de tour C
Les séquences
M
et
C
sont formées à partir des valeurs du paramètre de modèle variadique
consts
, qui représente les constantes
M
k
et
C
k
sous la forme
[
M
0
,
C
0
,
M
1
,
C
1
,... , ...,
M
n/2-1
,
C
n/2-1
]
.
Les nombres aléatoires sont générés par le processus suivant :
- Initialise la séquence de sortie S avec les éléments de X .
- Met à jour les éléments de S pendant r tours.
- Remplace les valeurs dans le tampon Y par les valeurs dans S .
Mise à jour de la séquence de sortie
Pour chaque cycle de mise à jour, une séquence intermédiaire V est initialisée avec les éléments de S dans un ordre spécifié :
| n | V 0 | V 1 | V 2 | V 3 |
|---|---|---|---|---|
| 2 | S 0 | S 1 | N/A | |
| 4 | S 2 | S 1 | S 0 | S 3 |
Étant données les notations d'opération suivantes :
- xor , intégré XOR bit à bit .
-
mullo
, calcule la moitié inférieure de la multiplication modulaire et est défini comme
mullo(a,b,w)=(a⋅b) mod 2
w
. -
mulhi
, calcule la moitié supérieure de la multiplication et est défini comme
mulhi(a,b,w)=⌊(a⋅b)/2
w
⌋ .
Soit
q
le numéro du tour actuel (commençant à zéro), pour chaque entier
k
dans
[
0
,
n
/
2
)
, les éléments de la séquence de sortie
S
sont mis à jour comme suit :
-
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)
Spécialisations prédéfinies
Les spécialisations suivantes définissent le moteur de nombres aléatoires avec deux ensembles de paramètres couramment utilisés :
|
Défini dans l'en-tête
<random>
|
|
| Type | Définition |
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
>
|
Types imbriqués
| Type | Définition |
result_type
|
UIntType
|
Membres de données
|
constexpr
std::size_t
word_size
[static]
|
w
(constante de membre public static) |
|
constexpr
std::size_t
word_count
[static]
|
n
(constante de membre public static) |
|
constexpr
std::size_t
round_count
[static]
|
r
(constante de membre public static) |
|
constexpr
std::
array
<
result_type, word_count
/
2
>
multipliers
[static]
|
la
séquence de multiplicateurs
M
(constante de membre public static) |
|
constexpr
std::
array
<
result_type, word_count
/
2
>
round_consts
[static]
|
la
séquence de constantes de tour
C
(constante de membre public static) |
|
constexpr
std::uint_least32_t
default_seed
[static]
|
20111115u
(constante de membre public static) |
Fonctions membres
Construction et Initialisation |
|
|
construit le moteur
(fonction membre publique) |
|
|
définit l'état actuel du moteur
(fonction membre publique) |
|
|
définit le compteur actuel du moteur
(fonction membre publique) |
|
Génération |
|
|
fait avancer l'état du moteur et retourne la valeur générée
(fonction membre publique) |
|
|
fait avancer l'état du moteur d'une quantité spécifiée
(fonction membre publique) |
|
Caractéristiques |
|
|
[static]
|
obtient la plus petite valeur possible dans la plage de sortie
(fonction membre publique statique) |
|
[static]
|
obtient la plus grande valeur possible dans la plage de sortie
(fonction membre publique statique) |
Fonctions non membres
|
(C++26)
|
compare les états internes de deux moteurs de nombres pseudo-aléatoires
(fonction) |
|
(C++26)
|
effectue des opérations d'entrée et de sortie sur flux pour un moteur de nombres pseudo-aléatoires
(modèle de fonction) |
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_philox_engine
|
202406L
|
(C++26) |
std::philox_engine
|
Exemple
|
Cette section est incomplète
Raison : aucun exemple |