slumpmässig rubrik i C++ | Set 1 (Generatorer)

slumpmässig rubrik i C++ | Set 1 (Generatorer)

Denna rubrik introducerar slumptalsgenereringsmöjligheter. Detta bibliotek gör det möjligt att producera slumptal genom att använda kombinationer av generatorer och distributioner.

    Generatorer : Objekt som genererar enhetligt fördelade tal.
  • Distributioner : Objekt som omvandlar talsekvenser som genereras av en generator till talsekvenser som följer en specifik slumpvariabelfördelning som likformig normal eller binomial.

Generatorer

I. Pseudo-slumptalsmotorer: De använder en algoritm för att generera slumpmässiga tal baserat på ett initialt frö. Dessa är:

slumptalsmotorer

1. linjär_kongruentiell_motor : Det är den enklaste motorn i STL-biblioteket som genererar slumpmässiga heltal utan tecken. Det följer: 

 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  
    operatör(): Det genererar slumptal. min: Det ger det lägsta värdet som returneras av medlemsoperatören(). max: Det ger det maximala värdet som returneras av medlemsoperatören().
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  ;   }   

Produktion:

211182246 is a random number between 1 and 2147483646 

2. mersenne_twister_engine: Det är en slumptalsmotor baserad på Mersenne Twister-algoritmen. Den producerar osignerade heltalsslumptal av hög kvalitet i intervallet [0 (2^w)-1].
där 'w' är ordstorlek: Antal bitar av varje ord i tillståndssekvensen. 

    operatör(): Det genererar slumptalet. min: Den returnerar det lägsta värdet som returneras av member operator() som för mersenne_twister_engine alltid är noll. max: Den returnerar det maximala värdet som returneras av medlemsoperator() som för mersenne_twister_engine är 2w-1 (där w är ordstorleken).
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  ;   }   

Produktion:

3348201622 is a random number between 0 and 4294967295 

3. subtrahera_med_bärmotor: Det är en pseudo-slumptalsgenerator som producerar heltal utan tecken.
Algoritmen som används är en lagd fibonacci generator med en tillståndssekvens av r heltalselement plus ett bärvärde.

    operatör() : Det genererar slumptalet. max : Den returnerar det maximala värdet som returneras av medlemsoperator() som är (2^w)-1 för subtract_with_carry_engine där 'w' är ordstorleken. min : Den returnerar det lägsta värdet som returneras av medlemsoperator() som alltid är noll för 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  ;   }   

Produktion:

8606455 is a random number between 0 and 16777215 


II. Generator av slumptal : Det är en slumptalsgenerator som producerar icke-deterministiska slumptal.

    random_device : Det är den sanna slumptalsgeneratorn. operatör() : Det returnerar ett nytt slumptal. min : Den returnerar det lägsta värdet som returneras av member operator() som för random_device alltid är noll. max : Den returnerar det maximala värdet som returneras av medlemsoperatören().
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  ;   }   

Produktion:

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

III. Pseudo-slumptalsmotorer (instansieringar) : Det här är de speciella instansieringarna av generatormotorer och adaptrar:

Pseudo-slumptalsmotorer (instansieringar)

1. default_random_engine : Detta är en motorklass för slumptal som genererar pseudoslumptal.

    min : Den returnerar det lägsta värdet som ges av operator(). max : Den returnerar det maximala värdet som ges av operatorn(). operatör() : Det returnerar ett nytt slumptal.
    Funktionen ändrar det interna tillståndet med en som modifierar tillståndsvärdet enligt den givna algoritmen:
 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  ;      }      

Produktion:

201066682 is a random number between 1 and 2147483646 

2. minstd_rand: Den genererar pseudoslumptal; det liknar linjär kongruentialgenerator

    operatör(): Det returnerar ett nytt slumptal. Funktionen ändrar det interna tillståndet med ett som modifierar tillståndsvärdet enligt följande algoritm:
x = (a.x + c) mod m where x= current state value a c and m=class template parameter 
    min: Den returnerar det lägsta värdet som ges av medlemsoperatören(). max: Den returnerar det maximala värdet som ges av medlemsoperator() som för linear_congruential_engine är (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  ;      }   

Produktion:

489592737 is a random number between 1 and 2147483646 

3.MT19937: Det är Mersenne Twister 19937 generator. Det är en pseudo-slumpgenerator av 32-bitars nummer med en tillståndsstorlek på 19937 bitar.

    operatör(): Det genererar ett slumptal. Funktionen ändrar det interna tillståndet med en genom att använda en övergångsalgoritm som ger en vridning på det valda elementet. max: Den returnerar det maximala värdet som ges av operator(). min: Den returnerar det lägsta värdet som ges av 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  ;      }   

Produktion:

1445431990 is a random number between 0 and 4294967295 

4. ranlux24_base: Det är Ranlux 24 basgenerator. Det är en subtrahera-med-bära pseudoslumpgenerator av 24-bitars tal som vanligtvis används som basmotor för ranlux24-generatorn.

    operatör(): Det returnerar ett nytt slumptal.
    Funktionen ändrar det interna tillståndet genom att anropa dess övergångsalgoritm som tillämpar en subtrahera-med-bär-operation på elementet. max: Den returnerar det maximala värdet som ges av operator(). min: Den returnerar det lägsta värdet som ges av 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  ;      }      

Produktion:

7275352 is a random number between 0 and 16777215 

Liknande format är tillämpligt för de andra exemplen.

IV. Motoradaptrar

slumpmässig rubrik i C++ | Set 1 (Generatorer)

1. discard_block_engine: Det är en mall för motoradapterklass som anpassar en pseudo-slumptalsgenerator Motor typ genom att endast använda 'r'-element i varje block av 'p'-element från sekvensen den producerar och kassera resten.
Adaptern håller en intern räkning av hur många element som har producerats i det aktuella blocket.

Standardgeneratorerna ranlux24 och ranlux48 anpassa a subtrahera_med_bärmotor med denna adapter.

    operatör(): Det returnerar ett nytt slumptal. max: Den returnerar det maximala värdet som ges av operator(). min: Den returnerar det lägsta värdet som ges av 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  ;      }      

Produktion:

8132325 is a random number between 0 and 16777215 

2. independent_bits_engine: Det är en mall för motoradapterklass som anpassar en pseudo-slumptalsgenerator Motor typ för att producera slumptal med ett specifikt antal bitar (w).

    operatör(): Det returnerar ett nytt slumptal.
    Motorns övergångsalgoritm anropar basmotorernas operator()-medlem så många gånger som behövs för att erhålla tillräckligt med signifikanta bitar för att konstruera ett slumpmässigt värde. max: Den returnerar det maximala värdet som ges av operator(). min: Den returnerar det lägsta värdet som ges av 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  ;      }      

Produktion:

13551674127875514537 is a random number between 0 and 184467 

3. shuffle_order_engine: Det är en mall för motoradapterklass som anpassar en pseudo-slumptalsgenerator Motor typ så att numren levereras i en annan ordningsföljd.
Objektet behåller en buffert med k genererade nummer internt och när det efterfrågas returnerar det ett slumpmässigt valt nummer i bufferten som ersätter det med ett värde som erhålls från dess basmotor.

    operatör(): Det returnerar ett nytt slumptal.
    Motorns övergångsalgoritm väljer ett värde i den interna tabellen (som returneras av funktionen) och ersätter det med ett nytt värde som erhålls från dess basmotor. max: Den returnerar det maximala värdet som ges av operator(). min: Den returnerar det lägsta värdet som ges av 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  ;      }      

Produktion:

9213395 is a random number between 0 and 16777215 
Skapa frågesport