Генераторы случайных чисел
Генерируйте случайные биты
«Генераторы случайных чисел» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Зачем нужна <random>
Старая функция rand() имеет низкое качество и плохо поддаётся управлению. Библиотека <random> разделяет генерацию случайности на генераторы (источники случайных битов) и распределения (формы выходных данных).
#include <iostream>
#include <random>
int main() {
std::mt19937 engine(42);
std::cout << "engine produced a value\n";
unsigned int v = engine();
std::cout << (v != 0 ? "non-zero" : "zero") << '\n';
return 0;
}Вихрь Мерсенна
std::mt19937 — самый распространённый генератор: быстрый, высококачественный и с большим периодом. Число в его названии обозначает размер его состояния в битах.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(1);
unsigned int a = gen();
unsigned int b = gen();
std::cout << (a != b ? "two different values" : "same") << '\n';
return 0;
}Генераторы детерминированы
При одном и том же начальном значении генератор всегда выдаёт одну и ту же последовательность. Благодаря этому результаты можно воспроизводить.
#include <iostream>
#include <random>
int main() {
std::mt19937 a(123), b(123);
std::cout << std::boolalpha << (a() == b()) << '\n';
std::cout << (a() == b()) << '\n';
return 0;
}Вызов генератора
Генератор можно вызывать как функцию. Каждый вызов engine() возвращает следующее исходное случайное целое число из своего диапазона.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(7);
for (int i = 0; i < 3; ++i) {
unsigned int v = gen();
std::cout << (v % 100) << ' ';
}
std::cout << '\n';
return 0;
}Диапазон генератора
min() и max() сообщают диапазон исходных значений, которые может выдавать генератор.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen;
std::cout << "min: " << gen.min() << '\n';
std::cout << "max: " << gen.max() << '\n';
return 0;
}Другие генераторы
Библиотека предлагает несколько генераторов:
minstd_rand: небольшой линейный конгруэнтный генератор.mt19937: универсальный генератор по умолчанию.ranlux48: более высокое качество, но меньшая скорость.
#include <iostream>
#include <random>
int main() {
std::minstd_rand lcg(5);
std::mt19937 mt(5);
std::cout << (lcg() % 10) << ' ' << (mt() % 10) << '\n';
return 0;
}64-разрядный генератор
Используйте std::mt19937_64, когда нужны 64-разрядные случайные значения, например для больших хешей или огромных диапазонов.
#include <iostream>
#include <random>
int main() {
std::mt19937_64 gen(99);
unsigned long long v = gen();
std::cout << "got a 64-bit value: " << (v != 0 ? "yes" : "no") << '\n';
return 0;
}Генератор и распределение
Исходные данные генератора равномерно распределены по огромному диапазону. Чтобы получать полезные значения, например результат броска игральной кости, передайте генератор в распределение.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2024);
std::uniform_int_distribution<int> die(1, 6);
std::cout << "rolled " << die(gen) << '\n';
return 0;
}Пропуск значений
discard(n) продвигает генератор на n шагов, не создавая выходных данных; это удобно для перемещения вперёд по последовательности.
#include <iostream>
#include <random>
int main() {
std::mt19937 a(10), b(10);
b.discard(2);
a(); a();
std::cout << std::boolalpha << (a() == b()) << '\n';
return 0;
}Повторное использование одного генератора
Создайте один генератор и повторно используйте его для всей случайности в программе. Создание нового генератора при каждом вызове расточительно и может снизить качество.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2026);
std::uniform_int_distribution<int> d10(1, 10);
int total = 0;
for (int i = 0; i < 5; ++i) total += d10(gen);
std::cout << "sum of 5 rolls: " << total << '\n';
return 0;
}Проблема начального значения по умолчанию
Созданный конструктором по умолчанию генератор использует фиксированное начальное значение по умолчанию, поэтому при каждом запуске выдаёт одну и ту же последовательность. Для настоящего разнообразия необходимо задать ему начальное значение (это рассматривается в следующем уроке).
#include <iostream>
#include <random>
int main() {
std::mt19937 gen; // default seed: same every run
std::cout << "first value mod 1000: " << (gen() % 1000) << '\n';
return 0;
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете генераторы случайных чисел.
Итоги
Вы изучили генераторы случайных чисел:
<random>отделяет генераторы (биты) от распределений (форма данных)std::mt19937— основной генератор; для заданного начального значения он детерминирован- повторно используйте один генератор и правильно задавайте ему начальное значение для настоящего разнообразия
Далее Вы научитесь формировать выходные данные генератора с помощью распределений.
Часто задаваемые вопросы
Урок «Генераторы случайных чисел» бесплатный?
Да — полный текст урока «Генераторы случайных чисел» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Генераторы случайных чисел»?
Генерируйте случайные биты Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Генераторы случайных чисел»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Генераторы случайных чисел
- Распределения
- Правильная инициализация генератора
- Практические примеры