0Pricing
C++ Academy · Урок

Генераторы случайных чисел

Генерируйте случайные биты

«Генераторы случайных чисел» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Генераторы случайных чисел
  2. Распределения
  3. Правильная инициализация генератора
  4. Практические примеры
← Назад к C++ Academy