Namespaces
Variants

std:: philox_engine

From cppreference.net
Défini dans l'en-tête <random>
template <

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

class philox_engine ;
(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é :

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 , 2 w
    )
    .
  • 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.
  • 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]
  1. Génère une nouvelle séquence de n valeurs aléatoires (voir ci-dessous) et les stocke dans Y .
  2. Incrémente le compteur Z de 1 .
  3. Réinitialise j à 0 .

L' algorithme de génération de philox_engine est GA(X i )=Y j .

  1. Dans ce cas, l'appel de l'algorithme de génération suivante retourne la prochaine valeur générée dans le tampon.
  2. 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 :

  1. Initialise la séquence de sortie S avec les éléments de X .
  2. Met à jour les éléments de S pendant r tours.
  3. 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)
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