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) (depuis C++11)
explicit subtract_with_carry_engine ( result_type value ) ;
(2) (depuis C++11)
template < class SeedSeq >
explicit subtract_with_carry_engine ( SeedSeq & seq ) ;
(3) (depuis C++11)
subtract_with_carry_engine ( const subtract_with_carry_engine & other ) ;
(4) (depuis C++11)
(déclaré implicitement)

Construit le moteur de nombres pseudo-aléatoires.

1) Le constructeur par défaut.
  • Si le moteur construit par défaut est de type std::ranlux24_base , la 10000ème invocation consécutive de celui-ci produit la valeur 7937952 .
  • Si le moteur construit par défaut est de type std::ranlux48_base , la 10000ème invocation consécutive de celui-ci produit la valeur 61839128582725 .
2) Construit le moteur avec une valeur de graine value . La séquence X de l' état initial du moteur est déterminée comme suit :
  1. Construit un objet std:: linear_congruential_engine < std:: uint_least32_t , 40014u, 0u, 2147483563u > e avec l'argument value == 0u ? default_seed : static_cast < std:: uint_least32_t > ( value % 2147483563u ) .
  2. Soit n égal à std:: size_t ( w / 32 ) + 1 .
  3. Définit les valeurs de X -r , ..., X -1 , dans cet ordre. Chaque valeur X i est définie comme spécifié ci-dessous :
  1. Appelle successivement e pendant n fois, les valeurs de retour sont notées z 0 ... z n-1 .
  2. Définit X i à (∑ n-1
    j=0
    z j ·2 32j
    ) mod m
    .
Si X -1 est 0 , définit la valeur de retenue c de l'état initial du moteur à 1 . Sinon, définit c à 0 .
3) Construit le moteur avec une séquence de graine seq . Étant donné std:: size_t ( w / 32 ) + 1 comme k , la séquence X de l' état initial du moteur est déterminée comme suit :
  1. Crée un objet tableau inventé a de longueur r * k .
  2. Appelle seq. generate ( a + 0 , a + r * k ) .
  3. Pour chaque entier i dans [ - r , - 1 ] , définit X i comme (∑ k-1
    j=0
    a k(i+r)+j ·2 32j
    ) mod m
    .
Si X -1 est 0 , définit la valeur de retenue c de l'état initial du moteur à 1 . Sinon, définit c à 0 .
Cette surcharge participe à la résolution de surcharge uniquement si SeedSeq satisfait aux exigences de SeedSequence .
4) Le constructeur de copie. Lors de la construction, * this == other est true .

Table des matières

Paramètres

value - valeur de départ à utiliser dans l'initialisation de l'état interne
seq - séquence de départ à utiliser dans l'initialisation de l'état interne

Complexité

1,2) ( std:: size_t ( w / 32 ) + 1 ) * r invocations de e .
3) Identique à la complexité de l'appel seq.generate .
4) O(r) .

Exceptions

3) Si SeedSeq n'est pas std::seed_seq , lance les exceptions levées par l'appel seq.generate .

Exemple

#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);
}

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 2181 C++11 la surcharge ( 3 ) ne lançait pas d'exception même si l'appel à seq.generate lance une exception propage l'exception
LWG 3809 C++11 e ne pouvait pas être construit si result_type est std::uint16_t peut être construit dans ce cas
LWG 4014 C++11 la résolution de LWG issue 3809 a causé que la graine initiale
du std::linear_congruential_engine intermédiaire
ait un type différent du result_type du moteur
tronque et
convertit value
P0935R0 C++11 le constructeur par défaut était explicite rendu implicite

Voir aussi

définit l'état actuel du moteur
(fonction membre publique)