std:: philox_engine
|
Definido en el encabezado
<random>
|
||
|
template
<
class
UIntType,
std::
size_t
w,
std::
size_t
n,
std::
size_t
r,
|
(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:
- sizeof... ( consts ) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
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 ,2w
).
-
-
Esta secuencia representa un valor de contador de entero sin signo grande
Z=∑
n-1
j=0 X⋅2 wj
de n⋅w bits.
-
Esta secuencia representa un valor de contador de entero sin signo grande
Z=∑
n-1
-
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:
- Genera una nueva secuencia de n valores aleatorios (ver abajo) y los almacena en Y .
- Incrementa el contador Z en 1 .
- Restablece j a 0 .
El
algoritmo de generación
de
philox_engine
es
GA(X
i
)=Y
j
.
- ↑ En este caso, la llamada al algoritmo de siguiente generación devuelve el siguiente valor generado en el buffer.
- ↑ 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:
- Inicializa la secuencia de salida S con los elementos de X .
- Actualiza los elementos de S durante r rondas.
- 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) |
|
(C++26)
|
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
|
Esta sección está incompleta
Razón: sin ejemplo |