0Pricing
C++ Academy · Lekcja

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.

Wszystkie lekcje w tym kursie

  1. Silniki losowe
  2. Rozkłady
  3. Prawidłowe inicjowanie ziarna
  4. Praktyczne przykłady
← Powrót do C++ Academy