0Pricing
C++ Academy · Урок

Распределения

Формируйте случайный вывод

«Распределения» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Назначение распределений

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

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    std::uniform_int_distribution<int> dist(1, 100);
    std::cout << "value: " << dist(gen) << '\n';
    return 0;
}

Равномерное распределение целых чисел

std::uniform_int_distribution<int>(a, b) возвращает целые числа из включительного диапазона [a, b], причём каждое число имеет одинаковую вероятность.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(5);
    std::uniform_int_distribution<int> die(1, 6);
    for (int i = 0; i < 5; ++i) std::cout << die(gen) << ' ';
    std::cout << '\n';
    return 0;
}

Равномерное распределение вещественных чисел

std::uniform_real_distribution<double>(a, b) выдаёт числа с плавающей точкой из диапазона [a, b), что удобно для вероятностей.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(3);
    std::uniform_real_distribution<double> dist(0.0, 1.0);
    std::cout << std::fixed << std::setprecision(3) << dist(gen) << '\n';
    return 0;
}

Распределение Бернулли

std::bernoulli_distribution(p) возвращает true с вероятностью p, моделируя подбрасывание несимметричной монеты.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(8);
    std::bernoulli_distribution coin(0.5);
    for (int i = 0; i < 5; ++i) std::cout << (coin(gen) ? 'H' : 'T');
    std::cout << '\n';
    return 0;
}

Нормальное распределение

std::normal_distribution<double>(mean, stddev) формирует колоколообразную кривую со значениями, сосредоточенными вокруг среднего.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(11);
    std::normal_distribution<double> dist(100.0, 15.0);
    std::cout << std::fixed << std::setprecision(1) << dist(gen) << '\n';
    return 0;
}

Повторное использование распределения

Распределения недороги при многократном вызове. Создайте одно распределение и вызывайте его в цикле с тем же генератором.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(20);
    std::uniform_int_distribution<int> d(1, 3);
    int counts[4] = {0};
    for (int i = 0; i < 12; ++i) counts[d(gen)]++;
    std::cout << counts[1] << ' ' << counts[2] << ' ' << counts[3] << '\n';
    return 0;
}

Распределение Пуассона

std::poisson_distribution<int>(mean) моделирует количество редких событий, например число прибытий в минуту.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(30);
    std::poisson_distribution<int> dist(4.0);
    for (int i = 0; i < 5; ++i) std::cout << dist(gen) << ' ';
    std::cout << '\n';
    return 0;
}

Параметры распределения

Вы можете получить параметры распределения с помощью методов доступа, таких как a(), b(), mean() или stddev().

#include <iostream>
#include <random>

int main() {
    std::uniform_int_distribution<int> d(10, 50);
    std::cout << "range: " << d.a() << " to " << d.b() << '\n';
    return 0;
}

Сброс состояния распределения

Некоторые распределения, например нормальное, кэшируют внутреннее состояние. reset() очищает его, поэтому следующее значение зависит только от генератора.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(40);
    std::normal_distribution<double> dist(0.0, 1.0);
    dist(gen);
    dist.reset();
    std::cout << "distribution state reset\n";
    return 0;
}

Выбор случайного элемента

Чтобы выбрать случайный индекс массива, используйте uniform_int_distribution в диапазоне от 0 до size - 1.

#include <iostream>
#include <random>
#include <string>

int main() {
    std::string colors[] = {"red", "green", "blue"};
    std::mt19937 gen(50);
    std::uniform_int_distribution<int> pick(0, 2);
    std::cout << colors[pick(gen)] << '\n';
    return 0;
}

Оценка числа π

Распределения лежат в основе методов Монте-Карло. Выборка случайных точек в квадрате позволяет оценить число π.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(60);
    std::uniform_real_distribution<double> u(0.0, 1.0);
    int inside = 0, n = 10000;
    for (int i = 0; i < n; ++i) {
        double x = u(gen), y = u(gen);
        if (x * x + y * y <= 1.0) ++inside;
    }
    std::cout << std::fixed << std::setprecision(2) << 4.0 * inside / n << '\n';
    return 0;
}

Быстрая проверка

Проверьте понимание диапазонов распределений.

Итоги

Вы узнали о распределениях:

  • они формируют выходные значения генератора: uniform_int (с включёнными границами), uniform_real ([a,b)), bernoulli, normal, poisson
  • вызывайте их вместе с генератором, например dist(gen), и повторно используйте в циклах
  • они позволяют выбирать элементы и выполнять оценки методом Монте-Карло

Далее Вы научитесь правильно задавать seed генераторам.

Часто задаваемые вопросы

Урок «Распределения» бесплатный?

Да — полный текст урока «Распределения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Распределения»?

Формируйте случайный вывод Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Распределения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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