Rozkłady
Kształtuj dane losowe
Rozkłady to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Działanie rozkładów
Rozkład przekształca surowe bity silnika w wartości o pożądanym kształcie i zakresie. Wywołuje się go, przekazując silnik jako argument.
#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;
}Jednostajny rozkład całkowitoliczbowy
std::uniform_int_distribution<int>(a, b) zwraca liczby całkowite z domkniętego zakresu [a, b], przy czym każda z nich jest jednakowo prawdopodobna.
#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;
}Jednostajny rozkład rzeczywisty
std::uniform_real_distribution<double>(a, b) zwraca wartości zmiennoprzecinkowe z zakresu [a, b), co jest przydatne do reprezentowania prawdopodobieństw.
#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;
}Rozkład Bernoulliego
std::bernoulli_distribution(p) zwraca true z prawdopodobieństwem p, modelując rzut monetą o nierównych szansach.
#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;
}Rozkład normalny
std::normal_distribution<double>(mean, stddev) generuje krzywą dzwonową skupioną wokół średniej.
#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;
}Ponowne używanie rozkładu
Rozkłady można wielokrotnie wywoływać przy niewielkim koszcie. Należy utworzyć jeden rozkład i wywoływać go w pętli z użyciem tego samego silnika.
#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;
}Rozkład Poissona
std::poisson_distribution<int>(mean) modeluje liczbę rzadkich zdarzeń, takich jak liczba przybyć w ciągu minuty.
#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;
}Parametry rozkładu
Parametry rozkładu można odczytywać za pomocą akcesorów, takich jak a(), b(), mean() lub 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;
}Resetowanie stanu rozkładu
Niektóre rozkłady, takie jak rozkład normalny, buforują stan wewnętrzny. reset() go usuwa, dzięki czemu następna wartość zależy wyłącznie od silnika.
#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;
}Wybieranie losowego elementu
Aby wybrać losowy indeks tablicy, należy użyć uniform_int_distribution w zakresie od 0 do 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;
}Szacowanie liczby pi
Rozkłady umożliwiają stosowanie metod Monte Carlo. Losowanie punktów w kwadracie pozwala oszacować liczbę pi.
#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;
}Szybkie sprawdzenie
Proszę sprawdzić swoją wiedzę na temat zakresów rozkładów.
Podsumowanie
Dowiedzieli się Państwo o rozkładach:
- kształtują wyniki silnika:
uniform_int(z końcami włącznie),uniform_real([a,b)),bernoulli,normal,poisson - wywołuje się je za pomocą silnika, na przykład
dist(gen), i ponownie wykorzystuje w pętlach - umożliwiają wybieranie elementów i szacowanie metodą Monte Carlo
W następnym kroku nauczą się Państwo prawidłowo inicjalizować ziarna silników.
Często zadawane pytania
Czy lekcja „Rozkłady” jest bezpłatna?
Tak — pełny tekst „Rozkłady” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rozkłady”?
Kształtuj dane losowe Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Rozkłady”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.