Namespaces
Variants

std:: philox_engine

From cppreference.net
Definido en el encabezado <random>
template <

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

class philox_engine ;
(desde C++26)

std::philox_engine es un motor de números aleatorios basado en contador.

Contenidos

Parámetros de plantilla

UIntType - El tipo de resultado generado por el generador. El efecto es indefinido si este no es uno de unsigned short , unsigned int , unsigned long , o unsigned long long .
w - el tamaño de palabra en bits
n - el número de palabras
r - el número de rondas
consts - la secuencia de multiplicadores y constantes de ronda utilizados para generar números aleatorios

Si cualquiera de los siguientes valores no es true , el programa está mal formado:

Propiedades del generador

En la siguiente descripción, sea Q i el i -ésimo elemento de la secuencia Q , donde el subíndice comienza desde cero.

El tamaño de los estados de philox_engine es O(n) , cada uno de ellos consiste en cuatro partes:

  • Una secuencia X de n valores enteros, donde cada valor está en [ 0 , 2 w
    )
    .
  • Esta secuencia representa un valor de contador de entero sin signo grande Z=∑ n-1
    j=0
    X⋅2 wj
    de n⋅w bits.
  • Una secuencia K de n / 2 claves de tipo UIntType .
  • Un búfer Y de n valores producidos de tipo UIntType .
  • Un índice j en el búfer Y .

El algoritmo de transición de philox_engine ( TA(X i ) ) se define de la siguiente manera:

  • Si j no es n - 1 , incrementa j en 1 . [1]
  • Si j es n - 1 , realiza las siguientes operaciones: [2]
  1. Genera una nueva secuencia de n valores aleatorios (ver abajo) y los almacena en Y .
  2. Incrementa el contador Z en 1 .
  3. Restablece j a 0 .

El algoritmo de generación de philox_engine es GA(X i )=Y j .

  1. En este caso, la llamada al algoritmo de siguiente generación devuelve el siguiente valor generado en el buffer.
  2. En este caso, el buffer se actualiza, y la llamada al algoritmo de siguiente generación devuelve el primer valor en el nuevo buffer.

Generación de valores aleatorios

Los valores aleatorios se generan a partir de los siguientes parámetros:

  • el número de rondas r
  • la secuencia de contador actual X
  • la secuencia de clave K
  • la secuencia multiplicadora M
  • la secuencia de constantes de ronda C

Las secuencias M y C se forman a partir de los valores del paquete de parámetros de plantilla consts , que representa las constantes M k y C k como [ M 0 , C 0 , M 1 , C 1 ,... , ..., M n/2-1 , C n/2-1 ] .

Los números aleatorios se generan mediante el siguiente proceso:

  1. Inicializa la secuencia de salida S con los elementos de X .
  2. Actualiza los elementos de S durante r rondas.
  3. Reemplaza los valores en el búfer Y con los valores en S .

Actualización de la secuencia de salida

Para cada ronda de actualización, una secuencia intermedia V se inicializa con los elementos de S en un orden específico:

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

Dadas las siguientes notaciones de operación:

  • xor , incorporado XOR bit a bit .
  • mullo , calcula la mitad baja de la multiplicación modular y se define como mullo(a,b,w)=(a⋅b) mod 2 w
    .
  • mulhi , calcula la mitad alta de la multiplicación y se define como mulhi(a,b,w)=⌊(a⋅b)/2 w
    .

Sea q el número de ronda actual (comenzando desde cero), para cada entero k en [ 0 , n / 2 ) , los elementos de la secuencia de salida S se actualizan de la siguiente manera:

  • 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)

Especializaciones predefinidas

Las siguientes especializaciones definen el motor de números aleatorios con dos conjuntos de parámetros de uso común:

Definido en el encabezado <random>
Tipo Definición
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 >

Tipos anidados

Tipo Definición
result_type UIntType

Miembros de datos

constexpr std::size_t word_size
[static]
w
(constante de miembro público estático)
constexpr std::size_t word_count
[static]
n
(constante de miembro público estático)
constexpr std::size_t round_count
[static]
r
(constante de miembro público estático)
constexpr std:: array < result_type, word_count / 2 > multipliers
[static]
la secuencia de multiplicadores M
(constante de miembro público estático)
constexpr std:: array < result_type, word_count / 2 > round_consts
[static]
la secuencia de constantes de ronda C
(constante de miembro público estático)
constexpr std::uint_least32_t default_seed
[static]
20111115u
(constante de miembro público estático)

Funciones miembro

Construcción y Inicialización
construye el motor
(función miembro pública)
establece el estado actual del motor
(función miembro pública)
establece el contador actual del motor
(función miembro pública)
Generación
avanza el estado del motor y devuelve el valor generado
(función miembro pública)
avanza el estado del motor en una cantidad especificada
(función miembro pública)
Características
[static]
obtiene el valor más pequeño posible en el rango de salida
(función miembro estática pública)
[static]
obtiene el valor más grande posible en el rango de salida
(función miembro estática pública)

Funciones no miembro

(C++26)
compara los estados internos de dos motores de números pseudoaleatorios
(función)
realiza entrada y salida de flujo en el motor de números pseudoaleatorios
(plantilla de función)

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

Ejemplo