Silniki losowe
Generuj losowe bity
Silniki losowe to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 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.
Dlaczego <random>?
Stara funkcja rand() ma niską jakość i trudno ją kontrolować. Biblioteka <random> rozdziela losowość na silniki (źródła losowych bitów) i rozkłady (kształt danych wyjściowych).
#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;
}Silnik Mersenne Twister
std::mt19937 to najczęściej używany silnik: szybki, wysokiej jakości i o długim okresie. Liczba określa rozmiar jego stanu w bitach.
#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;
}Silniki są deterministyczne
Przy tym samym ziarnie silnik zawsze generuje tę samą sekwencję. Dzięki temu wyniki są powtarzalne.
#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;
}Wywoływanie silnika
Silnik jest obiektem wywoływalnym. Każde wywołanie engine() zwraca następną surową liczbę całkowitą z jego zakresu.
#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;
}Zakres silnika
min() i max() zwracają zakres surowych wartości, które może generować silnik.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen;
std::cout << "min: " << gen.min() << '\n';
std::cout << "max: " << gen.max() << '\n';
return 0;
}Inne silniki
Biblioteka udostępnia kilka silników:
minstd_rand: mały liniowy generator kongruencyjny.mt19937: domyślny silnik ogólnego zastosowania.ranlux48: wyższa jakość, ale mniejsza szybkość.
#include <iostream>
#include <random>
int main() {
std::minstd_rand lcg(5);
std::mt19937 mt(5);
std::cout << (lcg() % 10) << ' ' << (mt() % 10) << '\n';
return 0;
}Silnik 64-bitowy
Użyj std::mt19937_64, gdy potrzebujesz 64-bitowych wartości losowych, na przykład do dużych hashy lub ogromnych zakresów.
#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;
}Silnik a rozkład
Surowe dane wyjściowe silnika mają rozkład jednostajny w bardzo dużym zakresie. Aby uzyskać użyteczne wartości, takie jak wynik rzutu kostką, należy przekazać silnik do rozkładu.
#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;
}Odrzucanie wartości
discard(n) przesuwa silnik o n kroków bez generowania danych wyjściowych, co przydaje się do pomijania fragmentu sekwencji.
#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;
}Ponowne używanie jednego silnika
Należy utworzyć jeden silnik i używać go ponownie dla całej losowości w programie. Tworzenie za każdym razem nowego silnika jest nieefektywne i może obniżyć jakość wyników.
#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;
}Pułapka domyślnego ziarna
Silnik utworzony za pomocą konstruktora domyślnego używa stałego ziarna domyślnego, dlatego przy każdym uruchomieniu generuje tę samą sekwencję. Aby uzyskać rzeczywistą różnorodność, trzeba go zainicjalizować ziarnem. Zostanie to omówione w następnej lekcji.
#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;
}Szybki test
Proszę sprawdzić swoją wiedzę na temat silników losowych.
Podsumowanie
Poznali Państwo silniki losowe:
<random>rozdziela silniki (bity) od rozkładów (kształt danych)std::mt19937jest podstawowym silnikiem; dla danego ziarna jest deterministyczny- należy ponownie używać jednego silnika i odpowiednio go inicjalizować ziarnem, aby uzyskać rzeczywistą różnorodność
Następnie poznają Państwo kształtowanie danych wyjściowych silnika za pomocą rozkładów.
Często zadawane pytania
Czy lekcja „Silniki losowe” jest bezpłatna?
Tak — pełny tekst „Silniki losowe” 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 „Silniki losowe”?
Generuj losowe bity Ć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 1 z 4.
Ile czasu zajmuje lekcja „Silniki losowe”?
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.