Namespaces
Variants

std::subtract_with_carry_engine<UIntType,w,s,r>:: subtract_with_carry_engine

From cppreference.net
subtract_with_carry_engine ( ) : subtract_with_carry_engine ( 0u ) { }
(1) (desde C++11)
explicit subtract_with_carry_engine ( result_type value ) ;
(2) (desde C++11)
template < class SeedSeq >
explicit subtract_with_carry_engine ( SeedSeq & seq ) ;
(3) (desde C++11)
subtract_with_carry_engine ( const subtract_with_carry_engine & other ) ;
(4) (desde C++11)
(declarado implícitamente)

Construye el motor de números pseudoaleatorios.

1) El constructor por defecto.
  • Si el motor construido por defecto es de tipo std::ranlux24_base , la 10000ª invocación consecutiva del mismo produce el valor 7937952 .
  • Si el motor construido por defecto es de tipo std::ranlux48_base , la 10000ª invocación consecutiva del mismo produce el valor 61839128582725 .
2) Construye el motor con un valor de semilla value . La secuencia X del estado inicial del motor se determina de la siguiente manera:
  1. Construye un objeto std:: linear_congruential_engine < std:: uint_least32_t , 40014u, 0u, 2147483563u > e con argumento value == 0u ? default_seed : static_cast < std:: uint_least32_t > ( value % 2147483563u ) .
  2. Sea n igual a std:: size_t ( w / 32 ) + 1 .
  3. Establece los valores de X -r , ..., X -1 , en ese orden. Cada valor X i se establece como se especifica a continuación:
  1. Llama sucesivamente a e durante n veces, los valores retornados se denotan como z 0 ... z n-1 .
  2. Establece X i como (∑ n-1
    j=0
    z j ·2 32j
    ) mod m
    .
Si X -1 es 0 , establece el valor de acarreo c del estado inicial del motor a 1 . De lo contrario, establece c a 0 .
3) Construye el motor con una secuencia de semilla seq . Dado std:: size_t ( w / 32 ) + 1 como k , la secuencia X del estado inicial del motor se determina de la siguiente manera:
  1. Crea un objeto de arreglo inventado a de longitud r * k .
  2. Llama seq. generate ( a + 0 , a + r * k ) .
  3. Para cada entero i en [ - r , - 1 ] , establece X i a (∑ k-1
    j=0
    a k(i+r)+j ·2 32j
    ) mod m
    .
Si X -1 es 0 , establece el valor de acarreo c del estado inicial del motor a 1 . De lo contrario, establece c a 0 .
Esta sobrecarga participa en la resolución de sobrecarga solo si SeedSeq cumple con los requisitos de SeedSequence .
4) El constructor de copia. Al construir, * this == other es true .

Contenidos

Parámetros

value - valor de semilla a utilizar en la inicialización del estado interno
seq - secuencia de semilla a utilizar en la inicialización del estado interno

Complejidad

1,2) ( std:: size_t ( w / 32 ) + 1 ) * r invocaciones de e .
3) Igual que la complejidad de la llamada a seq.generate .
4) O(r) .

Excepciones

3) Si SeedSeq no es std::seed_seq , lanza las excepciones generadas por la llamada seq.generate .

Ejemplo

#include <cassert>
#include <random>
int main()
{
    std::ranlux24_base gen24; // overload (1)
    std::ranlux48_base gen48; // overload (1)
    gen24.discard(10000 - 1);
    gen48.discard(10000 - 1);
    assert(gen24() == 7'937'952);
    assert(gen48() == 61'839'128'582'725);
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2181 C++11 la sobrecarga ( 3 ) no lanzaría excepción incluso si la llamada seq.generate lanza propaga la excepción
LWG 3809 C++11 e no podía construirse si result_type es std::uint16_t puede construirse en este caso
LWG 4014 C++11 la resolución de LWG issue 3809 causó que la semilla inicial
del std::linear_congruential_engine intermedio
tuviera un tipo diferente al result_type del motor
trunca y
convierte value
P0935R0 C++11 el constructor por defecto era explícito hecho implícito

Véase también

establece el estado actual del motor
(función miembro pública)