случайный заголовок в C ++ | Набор 1 (Генераторы)

Опубликовано: 5 Января, 2022

Этот заголовок знакомит с возможностями генерации случайных чисел. Эта библиотека позволяет создавать случайные числа, используя комбинации генераторов и распределений.

  • Генераторы : объекты, генерирующие равномерно распределенные числа.
  • Распределения : объекты, которые преобразуют последовательности чисел, сгенерированные генератором, в последовательности чисел, которые следуют определенному распределению случайных величин, например равномерному, нормальному или биномиальному.

Генераторы

I. Механизмы псевдослучайных чисел: они используют алгоритм для генерации случайных чисел на основе начального числа. Эти:

  1. linear_congruential_engine : это простейший механизм в библиотеке STL, который генерирует случайные целые числа без знака. Следует:
     х = (ах + с) мод м 
    Где x = текущее значение состояния  
                a = параметр множителя; если m не равно нулю, 
                этот параметр должен быть меньше m.
                c = параметр приращения; если m не равно нулю, 
                этот параметр должен быть меньше m.
                m = параметр модуля
    • operator (): генерирует случайное число.
    • min: дает минимальное значение, возвращаемое оператором-членом ().
    • max: дает максимальное значение, возвращаемое оператором-членом ().
    // C++ program to illustrate
    // the use of operator(), max and min
    // in linear_congruential_engine
    #include <iostream>
    #include <chrono>
    #include <random>
    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;
    }

    Выход:

    211182246 - случайное число от 1 до 2147483646.
    
  2. mersenne_twister_engine: это механизм случайных чисел, основанный на алгоритме Mersenne Twister. Он производит высококачественные целые случайные числа без знака в интервале [0, (2 ^ w) -1].
    где 'w' - размер слова: количество битов каждого слова в последовательности состояний.

    • operator (): генерирует случайное число.
    • min: возвращает минимальное значение, возвращаемое элементом operator (), которое для mersenne_twister_engine всегда равно нулю.
    • max: возвращает максимальное значение, возвращаемое оператором-членом (), которое для mersenne_twister_engine равно 2w-1 (где w - размер слова).
    // C++ program to illustrate the use of
    // operator(), min and max
    // in mersenne_twister_engine
    #include <iostream>
    #include <chrono>
    #include <random>
    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;
    }

    Выход:

    3348201622 - случайное число от 0 до 4294967295
    
  3. subtract_with_carry_engine: это механизм генератора псевдослучайных чисел, который производит беззнаковые целые числа.
    Используемый алгоритм представляет собой запаздывающий генератор Фибоначчи с последовательностью состояний r целочисленных элементов плюс одно значение переноса.
    • operator () : генерирует случайное число.
    • max : он возвращает максимальное значение, возвращаемое оператором-членом (), которое равно (2 ^ w) -1 для subtract_with_carry_engine, где 'w' - размер слова.
    • min : возвращает минимальное значение, возвращаемое оператором-членом (), которое всегда равно нулю для subtract_with_carry_engine.
    // C++ program to illustrate the use of
    // operator(), min and max
    // in subtract_with_carry_engine
    #include <iostream>
    #include <chrono>
    #include <random>
    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;
    }

    Выход:

     8606455 - случайное число от 0 до 16777215
    

    II. Генератор случайных чисел : это генератор случайных чисел, который производит недетерминированные случайные числа.

    • random_device : это настоящий генератор случайных чисел.
    • operator () : возвращает новое случайное число.
    • min : возвращает минимальное значение, возвращаемое оператором-членом (), которое для random_device всегда равно нулю.
    • max : возвращает максимальное значение, возвращаемое оператором-членом ().
    // C++ program to illustrate the use of
    // operator(), min and max
    // in random_device
    #include <iostream>
    #include <random>
    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;
    }

    Выход:

     Характеристики random_device по умолчанию:
    минимум: 0
    максимум: 4294967295
    энтропия: 0
    случайное число: 3705944883
    

    III. Механизмы псевдослучайных чисел (экземпляры) : это конкретные экземпляры двигателей и адаптеров генераторов:

    1. default_random_engine : это класс механизма случайных чисел, который генерирует псевдослучайные числа.
      • min : возвращает минимальное значение, заданное оператором ().
      • max : возвращает максимальное значение, заданное оператором ().
      • operator () : возвращает новое случайное число.
        Функция изменяет внутреннее состояние на единицу, что изменяет значение состояния согласно заданному алгоритму:
         х = (ах + с) мод м
         Где x = текущее значение состояния
         a и c = соответствующие параметры шаблона класса
         m = параметр шаблона класса 
        
      // C++ program to illustrate the use of
      // operator(), min and max
      // in default_random_engine
      #include <iostream>
      #include <chrono>
      #include <random>
      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;
      }

      Выход:



       201066682 - случайное число от 1 до 2147483646
      
    2. minstd_rand: генерирует псевдослучайные числа; он похож на линейный конгруэнтный генератор
      • operator (): возвращает новое случайное число. Функция изменяет внутреннее состояние на единицу, что изменяет значение состояния по следующему алгоритму:
        х = (ах + с) мод м
        где x = текущее значение состояния
        a, c и m = параметр шаблона класса
        
      • min: возвращает минимальное значение, заданное оператором-членом ().
      • max: возвращает максимальное значение, заданное членом operator (), которое для linear_congruential_engine равно (модуль-1).
      // C++ program to illustrate
      // the use of operator(), max and min
      // in minstd_rand
      #include <iostream>
      #include <chrono>
      #include <random>
      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;
      }

      Выход:

       489592737 - случайное число от 1 до 2147483646
      
    3. mt19937: Генератор Mersenne Twister 19937. Это псевдослучайный генератор 32-битных чисел с размером состояния 19937 бит.
      • operator (): генерирует случайное число. Функция изменяет внутреннее состояние на единицу, используя алгоритм перехода, который производит поворот выбранного элемента.
      • max: возвращает максимальное значение, заданное оператором ().
      • min: возвращает минимальное значение, заданное оператором ().
      // C++ program to illustrate the
      // use of operator(),min and max
      // in mt19937
      #include <iostream>
      #include <chrono>
      #include <random>
      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;
      }

      Выход:

       1445431990 - случайное число от 0 до 4294967295
      
    4. ranlux24_base: Это базовый генератор Ranlux 24. Это псевдослучайный генератор 24-битных чисел с вычитанием с переносом, обычно используемый в качестве базового механизма для генератора ranlux24.
      • operator (): возвращает новое случайное число.
        Функция изменяет внутреннее состояние, вызывая свой алгоритм перехода, который применяет к элементу операцию вычитания с переносом.
      • max: возвращает максимальное значение, заданное оператором ().
      • min: возвращает минимальное значение, заданное оператором ().
      // C++ program to illustrate
      // the use of operator(),min and max
      // in ranlux24_base
      #include <iostream>
      #include <chrono>
      #include <random>
      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;
      }

      Выход:

       7275352 - случайное число от 0 до 16777215
      

    Аналогичный формат применим и к другим примерам.

    IV. Адаптеры двигателя

    1. discard_block_engine: это шаблон класса адаптера движка, который адаптирует тип движка генератора псевдослучайных чисел , используя только элементы «r» каждого блока элементов «p» из создаваемой им последовательности, отбрасывая остальные.
      Адаптер ведет внутренний подсчет количества элементов, созданных в текущем блоке.
      Стандартные генераторы ranlux24 и ranlux48 адаптируют subtract_with_carry_engine с помощью этого адаптера.
      • operator (): возвращает новое случайное число.
      • max: возвращает максимальное значение, заданное оператором ().
      • min: возвращает минимальное значение, заданное оператором ().
      // C++ program to illustrate
      // the use of operator(),min and max
      // in the discard_block_engine
      #include <iostream>
      #include <chrono>
      #include <random>
      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 instantitation
      //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;
      }

      Выход:

       8132325 - случайное число от 0 до 16777215
      
    2. independent_bits_engine: это шаблон класса адаптера движка, который адаптирует тип движка генератора псевдослучайных чисел для создания случайных чисел с определенным количеством битов (w).
      • operator (): возвращает новое случайное число.
        Алгоритм перехода движка вызывает элемент operator () базового движка столько раз, сколько необходимо, чтобы получить достаточно значащих битов для построения случайного значения.
      • max: возвращает максимальное значение, заданное оператором ().
      • min: возвращает минимальное значение, заданное оператором ().
      // C++ program to illustrate
      // the use of operator(),min and max
      // in independent_bits_engine
      #include <iostream>
      #include <chrono>
      // It imports the symbol names in
      // std namespace and possibly in Global namespace.
      #include <cstdint>
      #include <random>
      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;
      }

      Выход:

       13551674127875514537 - случайное число от 0 до 18446744073709551615
      
    3. shuffle_order_engine: это шаблон класса адаптера движка, который адаптирует тип движка генератора псевдослучайных чисел, чтобы числа доставлялись в другой последовательности.

      Объект хранит буфер из k сгенерированных чисел внутри и при запросе возвращает случайно выбранное число в буфере, заменяя его значением, полученным из его базового механизма.

      • operator (): возвращает новое случайное число.
        Алгоритм перехода движка выбирает значение во внутренней таблице (которое возвращается функцией) и заменяет его новым значением, полученным из его базового движка.
      • max: возвращает максимальное значение, заданное оператором ().
      • min: возвращает минимальное значение, заданное оператором ().
      // C++ program to illustrate
      // the use of operator(),min and max
      // in shuffle_order_engine
      #include <iostream>
      #include <chrono>
      #include <random>
      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 instantitation
      // 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;
      }

      Выход:

       9213395 - случайное число от 0 до 16777215
      

    Эта статья предоставлена Шамбхави Сингхом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

    Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

    Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .