случайный заголовок в C ++ | Набор 1 (Генераторы)
Этот заголовок знакомит с возможностями генерации случайных чисел. Эта библиотека позволяет создавать случайные числа, используя комбинации генераторов и распределений.
- Генераторы : объекты, генерирующие равномерно распределенные числа.
- Распределения : объекты, которые преобразуют последовательности чисел, сгенерированные генератором, в последовательности чисел, которые следуют определенному распределению случайных величин, например равномерному, нормальному или биномиальному.
Генераторы
I. Механизмы псевдослучайных чисел: они используют алгоритм для генерации случайных чисел на основе начального числа. Эти:
- 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.
- 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
- 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. Механизмы псевдослучайных чисел (экземпляры) : это конкретные экземпляры двигателей и адаптеров генераторов:
- 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
- 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
- operator (): возвращает новое случайное число. Функция изменяет внутреннее состояние на единицу, что изменяет значение состояния по следующему алгоритму:
- 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
- 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
- operator (): возвращает новое случайное число.
Аналогичный формат применим и к другим примерам.
IV. Адаптеры двигателя
- 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
- 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
- operator (): возвращает новое случайное число.
- 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
- operator (): возвращает новое случайное число.
Эта статья предоставлена Шамбхави Сингхом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .