antet aleatoriu în C++ | Set 1 (generatoare)

antet aleatoriu în C++ | Set 1 (generatoare)

Acest antet introduce facilități de generare de numere aleatorii. Această bibliotecă permite producerea de numere aleatorii folosind combinații de generatoare și distribuții.

    Generatoare : Obiecte care generează numere distribuite uniform.
  • Distribuții : Obiecte care transformă secvențe de numere generate de un generator în secvențe de numere care urmează o distribuție specifică de variabile aleatoare, cum ar fi normală uniformă sau binomială.

Generatoare

I. Motoare cu numere pseudoaleatoare: Ei folosesc un algoritm pentru a genera numere aleatorii bazate pe o sămânță inițială. Acestea sunt:

motoare cu numere aleatorii

1. motor_liniar_congruential : Este cel mai simplu motor din biblioteca STL care generează numere întregi fără semn aleatoriu. Urmează: 

 x = (a.x +c) mod m Where x= current state value a = multiplier parameter ; if m is not zero this parameter should be lower than m. c = increment parameter ; if m is not zero this parameter should be lower than m. m = modulus parameter  
    operator(): Acesta generează un număr aleator. min: Oferă valoarea minimă returnată de operatorul membru(). max: Oferă valoarea maximă returnată de operatorul membru().
C++
   // C++ program to illustrate   // the use of operator() max and min   // in linear_congruential_engine   #include          #include         #include         using     namespace     std  ;   // driver program   int     main     ()   {      // finds the time between the system clock      //(present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          // minstd_rand0 is a standard      // linear_congruential_engine      minstd_rand0     generator     (  seed  );             // generates the random number      cout      < <     generator  ()      < <     ' is a random number between '  ;          //use of min and max functions      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();          return     0  ;   }   

Ieșire:

211182246 is a random number between 1 and 2147483646 

2. mersenne_twister_engine: Este un motor de numere aleatorii bazat pe algoritmul Mersenne Twister. Produce numere aleatoare întregi fără semn de înaltă calitate în intervalul [0 (2^w)-1].
unde „w” este dimensiunea cuvântului: numărul de biți ai fiecărui cuvânt din secvența stărilor. 

    operator(): Acesta generează un număr aleator. min: Returnează valoarea minimă returnată de operator() membru, care pentru mersenne_twister_engine este întotdeauna zero. max: Returnează valoarea maximă returnată de operator() membru, care pentru mersenne_twister_engine este 2w-1 (unde w este dimensiunea cuvântului).
C++
   // C++ program to illustrate the use of    // operator() min and max   // in mersenne_twister_engine    #include          #include         #include         using     namespace     std  ;   // Driver program   int     main     ()   {          // finds the time between the system clock      // (present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          // mt19937 is a standard mersenne_twister_engine      mt19937     generator     (  seed  );             // use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;          // use of max and min      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();          return     0  ;   }   

Ieșire:

3348201622 is a random number between 0 and 4294967295 

3. scădere_cu_carry_engine: Este un motor generator de numere pseudo-aleatoare care produce numere întregi fără semn.
Algoritmul utilizat este un lagged generator de Fibonacci cu o secvență de stări de r elemente întregi plus o valoare de transport.

    operator() : generează un număr aleator. max : returnează valoarea maximă returnată de operator() membru, care este (2^w)-1 pentru subtract_with_carry_engine unde 'w' este dimensiunea cuvântului. min : returnează valoarea minimă returnată de operator() membru care este întotdeauna zero pentru subtract_with_carry_engine.
C++
   // C++ program to illustrate the use of    // operator() min and max   // in subtract_with_carry_engine   #include          #include         #include         using     namespace     std  ;   // Driver program   int     main     ()   {          // finds the time between the system clock      // (present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          subtract_with_carry_engine   <  unsigned       24       10       24  >     generator     (  seed  );          // use of operator()      cout      < <     generator  ()      < <     ' is a random number between '  ;          // use of min and max      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();      return     0  ;   }   

Ieșire:

8606455 is a random number between 0 and 16777215 


II. Generator de numere aleatorii : Este un generator de numere aleatoare care produce numere aleatoare nedeterministe.

    dispozitiv_aleatoriu : Este adevăratul generator de numere aleatoare. operator() : returnează un nou număr aleatoriu. min : returnează valoarea minimă returnată de operator() membru, care pentru dispozitiv_aleatoriu este întotdeauna zero. max : returnează valoarea maximă returnată de operatorul membru().
C++
   // C++ program to illustrate the use of    // operator() min and max   // in random_device    #include          #include         using     namespace     std  ;   //Driver program   int     main     ()   {      random_device     example  ;          cout      < <     'default random_device characteristics:'      < <     endl  ;          // use of min      cout      < <     'minimum: '      < <     example  .  min  ()      < <     endl  ;          // use of max      cout      < <     'maximum: '      < <     example  .  max  ()      < <     endl  ;          // use of entropy      cout      < <     'entropy: '      < <     example  .  entropy  ()      < <     endl  ;          // use of operator()      cout      < <     'a random number: '      < <     example  ()      < <     endl  ;          return     0  ;   }   

Ieșire:

default random_device characteristics: minimum: 0 maximum: 4294967295 entropy: 0 a random number: 3705944883 

III. Motoare cu numere pseudoaleatoare (instanțări) : Acestea sunt instanțiile particulare ale motoarelor și adaptoarelor generatoarelor:

Motoare cu numere pseudoaleatoare (instanțări)

1. default_random_engine : Aceasta este o clasă de motor de numere aleatoare care generează numere pseudoaleatoare.

    min : returnează valoarea minimă dată de operator(). max : returnează valoarea maximă dată de operator(). operator() : returnează un nou număr aleatoriu.
    Funcția schimbă starea internă cu una care modifică valoarea stării conform algoritmului dat:
 x= (a.x + c)mod m Where x= current state value a and c = respective class template parameters m = class template parameter  
C++
   // C++ program to illustrate the use of    // operator() min and max    // in default_random_engine    #include             #include            #include            using     namespace     std  ;          // Driver program    int     main     ()      {             // finds the time between the system clock       // (present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // minstd_rand0 is a standard linear_congruential_engine       minstd_rand0     generator     (  seed  );             // generates the random number       cout      < <     generator  ()      < <     ' is a random number between '  ;             // Use of min and max       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

Ieșire:

201066682 is a random number between 1 and 2147483646 

2. minstd_rand: Acesta generează numere pseudoaleatoare; este asemănător cu generator liniar congruențial

    operator(): Acesta returnează un nou număr aleatoriu. Funcția schimbă starea internă cu una care modifică valoarea stării conform următorului algoritm:
x = (a.x + c) mod m where x= current state value a c and m=class template parameter 
    min: Returnează valoarea minimă dată de operatorul membru(). max: Returnează valoarea maximă dată de operatorul membru () care pentru motorul_liniar_congruențial este (modulus-1).
C++
   // C++ program to illustrate    // the use of operator() max and min    // in minstd_rand    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // minstd_rand0 is a standard       //linear_congruential_engine       minstd_rand0     generator     (  seed  );             // use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }   

Ieșire:

489592737 is a random number between 1 and 2147483646 

3.MT19937: Este un generator Mersenne Twister 19937. Este un generator pseudo-aleatoriu de numere pe 32 de biți cu o dimensiune a stării de 19937 de biți.

    operator(): Acesta generează un număr aleatoriu. Funcția schimbă starea internă cu una folosind un algoritm de tranziție care produce o răsucire a elementului selectat. max: Returnează valoarea maximă dată de operator(). min: Returnează valoarea minimă dată de operator().
     
C++
   // C++ program to illustrate the    // use of operator()min and max    // in mt19937    #include             #include            #include            using     namespace     std  ;          // Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // mt19937 is a standard       //mersenne_twister_engine       mt19937     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }   

Ieșire:

1445431990 is a random number between 0 and 4294967295 

4. ranlux24_base: Este un generator de bază Ranlux 24. Este un generator pseudo-aleatoriu de scădere cu transportare de numere pe 24 de biți, utilizat în general ca motor de bază pentru generatorul ranlux24.

    operator(): Acesta returnează un nou număr aleatoriu.
    Funcția schimbă starea internă apelând algoritmul său de tranziție care aplică o operație de scădere cu transport pe element. max: Returnează valoarea maximă dată de operator(). min: Returnează valoarea minimă dată de operator().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in ranlux24_base    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();         subtract_with_carry_engine   <  unsigned    24    10    24  >     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

Ieșire:

7275352 is a random number between 0 and 16777215 

Format similar este aplicabil pentru celelalte exemple.

IV. Adaptoare de motor

antet aleatoriu în C++ | Set 1 (generatoare)

1. discard_block_engine: Este un șablon de clasă de adaptor de motor care adaptează a Motor generator de numere pseudo-aleatoare tastați folosind doar elemente „r” din fiecare bloc de elemente „p” din secvența pe care o produce, aruncând restul.
Adaptorul păstrează un număr intern al câte elemente au fost produse în blocul curent.

Generatoarele standard ranlux24 şi ranlux48 adapta a scădere_cu_carry_engine folosind acest adaptor.

    operator(): Acesta returnează un nou număr aleatoriu. max: Returnează valoarea maximă dată de operator(). min: Returnează valoarea minimă dată de operator().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in the discard_block_engine    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // ranlux24 is a standard instantiation       //of discard_block_engine:       ranlux24     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

Ieșire:

8132325 is a random number between 0 and 16777215 

2. independent_bits_engine: Este un șablon de clasă de adaptor de motor care adaptează a Motor generator de numere pseudo-aleatoare tip pentru a produce numere aleatorii cu un anumit număr de biți (w).

    operator(): Acesta returnează un nou număr aleatoriu.
    Algoritmul de tranziție al motorului invocă membrul operator() al motoarelor de bază de câte ori este necesar pentru a obține suficienți biți semnificativi pentru a construi o valoare aleatorie. max: Returnează valoarea maximă dată de operator(). min: Returnează valoarea minimă dată de operator().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in independent_bits_engine    #include             #include                // It imports the symbol names in    // std namespace and possibly in Global namespace.    #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             //use of independent_bits_engine       independent_bits_engine   <  mt19937    64    uint_fast64_t  >     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

Ieșire:

13551674127875514537 is a random number between 0 and 184467 

3. shuffle_order_engine: Este un șablon de clasă de adaptor de motor care adaptează a Motor generator de numere pseudo-aleatoare tastați astfel încât numerele să fie livrate într-o secvență diferită.
Obiectul păstrează un buffer de k numere generate intern și, atunci când este solicitat, returnează un număr selectat aleatoriu în buffer, înlocuindu-l cu o valoare obținută din motorul său de bază.

    operator(): Acesta returnează un nou număr aleatoriu.
    Algoritmul de tranziție al motorului alege o valoare din tabelul intern (care este returnată de funcție) și o înlocuiește cu o nouă valoare obținută din motorul său de bază. max: Returnează valoarea maximă dată de operator(). min: Returnează valoarea minimă dată de operator().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in shuffle_order_engine    #include             #include            #include            using     namespace     std  ;          int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // ranlux24 is a standard instantiation       // of discard_block_engine:       ranlux24     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

Ieșire:

9213395 is a random number between 0 and 16777215 
Creați un test