logo

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' title=

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

forma completă cdr
 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)' title=

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

superscript în ilustrator
    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.

ce face un calculator rapid
    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<unsigned241024> 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<mt1993764uint_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:

data curentă în java
9213395 is a random number between 0 and 16777215
Creați un test