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