Główna zawartość
Podstawy informatyki - program rozszerzony
Kurs: Podstawy informatyki - program rozszerzony > Rozdział 6
Lekcja 2: Symulacja losowościGenerowanie liczb losowych
Czy kiedykolwiek rzucałeś monetą lub kostką do gry? Jeśli tak, to wygenerowałeś losową wartość - i prawdopodobnie użyłeś tej wartości do podjęcia decyzji.
Możemy również generować losowe wartości w naszych programach komputerowych i używać ich do podejmowania decyzji i symulowania naturalnych procesów.
Generowanie wartości losowych
Komputery nie są oczywiście zbyt dobre w przypadkowości. Ich siła polega na generowaniu przewidywalnych wyników poprzez wykonywanie sekwencji zaprogramowanych operacji. To tylko przeciwieństwo losowości.
Aby wygenerować naprawdę przypadkową liczbę, komputer musiałby monitorować naturalnie występujący proces niedeterministyczny, taki jak rozpad jądra atomowego cząsteczki uranu. Jest to zarówno kosztowne, jak i powolne, więc większość komputerów osobistych nie posiada prawdziwych generatorów liczb losowych.
Jednakże informatycy znaleźli sposoby na generowanie "pseudolosowych" liczb w programach komputerowych i są one wystarczająco dobre dla większości celów.
Języki programowania i biblioteki zapewniają procedury do generowania tych pseudolosowych liczb.
W JavaScript,
Math.random()
generuje pseudolosową liczbę z zakresu od 0 (włącznie) do 1 (bez 1). Poniższy program wyświetla numer wygenerowany z
Math.random()
. Naciśnij "Restart", aby zobaczyć jak się zmienia za każdym razem.Po wywołaniu wystarczającej ilości razy,
Math.random()
w końcu wygeneruje liczbę 0. Jednakże, nigdy nie wygeneruje 1.Ta oś liczbowa wizualizuje wszystkie możliwe wygenerowane wartości w kolorze niebieskim:
A co jeśli będziemy potrzebować większego numeru? Być może nasz program rysuje drzewo i wybiera, aby narysować je między 0 a 6 stopami wysokości.
Możemy to zrobić mnożąc wynik
Math.random()
przez 6. Wypróbuj go poniżej.Program ten generuje wartości od 0 (włącznie) do 6 (bez 6):
Generowanie losowych liczb całkowitych
A co z ograniczeniem wartości losowych do liczb całkowitych? Jeśli symulujemy rzut kośćmi, nie chcemy otrzymać liczb typu "1.267" lub "5.431". Chcemy tylko zobaczyć liczby całkowite, reprezentujące każdą stronę kostki.
W tym celu musimy zaokrąglić wynik używając
Math.floor()
. Procedura floor()
zaokrągli wartość w dół do najbliższej liczby całkowitej. Wypróbuj to poniżej. Czy można wygenerować wszystkie możliwe liczby całkowite z zakresu?
Gdy zrestartujesz program wystarczająco dużo razy, powinieneś w końcu zobaczyć, że wyświetla on wszystkie liczby całkowite od 0 do 5:
Jesteśmy bardzo blisko symulacji rzutu kostką, ale nie do końca. Nasz program generuje liczby 0-5, ale standardowa sześciokątna kostka odpowiada liczbom 1-6:
To łatwe do naprawienia. Po prostu dodamy 1 do zaokrąglonego wyniku i tadam, mamy symulację rzutu kostką!
Może się okazać, że często chcemy wygenerować losowe liczby całkowite pomiędzy dwoma wartościami. Moglibyśmy skopiować i wkleić kod z góry... albo, lepiej, zrobić własną procedurę wielokrotnego użytku!
Procedura
randomInt()
jest wygodną abstrakcją nad Math.random()
, pozwalającą nam na generowanie losowych liczb całkowitych bez martwienia się o szczegóły:Sprawdzanie wartości losowych za pomocą warunków
Teraz gdy wiemy, jak wygenerować wiele przedziałów i typów liczb losowych, wykorzystajmy te liczby.
Możemy użyć warunku, aby sprawdzić wartość liczby losowej i wybrać inny kod do wykonania bazując na tej wartości.
Dla przykładu, kod ten symuluje rzut monetą:
if (Math.random() < 0.5) {
println("heads!");
} else {
println("tails!");
}
Kiedy używamy warunkowego do sprawdzania losowej wartości, musimy upewnić się, że nasz warunek odpowiada szansie, że zdarzenie się wydarzy. W powyższym kodzie
Math.random ()
generuje wartości od 0 do 1, więc warunek sprawdza, czy wartość znajduje się w pierwszej połowie tego zakresu.Jeśli symulujemy szanse jak "1 na 4", to jest to dobry moment na użycie
if
/else
z powyższą procedurą randomInt()
:var val = randomInt(1, 4);
if (val === 1 ) {
println("1");
} else if (val === 2 ) {
println("2");
} else if (val === 3 ) {
println("3");
} else {
println("4");
}
Kiedy sprawdzamy, czy taki kod działa zgodnie z oczekiwaniami, nie możemy po prostu uruchomić go raz; pokaże on tylko jedną wartość i jedną ścieżkę kodu. Musimy uruchomić go kilka razy, upewniając się, że komputer w końcu wybierze każdą z możliwych ścieżek.
Jeśli chcemy nabrać jeszcze większej pewności, możemy uruchomić go tysiące razy i sprawdzić, czy rozkład ścieżek kodu odpowiada naszym oczekiwaniom. Dla powyższego kodu widzielibyśmy każdą ścieżkę wybraną średnio 25% czasu. Nie byłoby to dokładnie 25%, ale byłoby blisko.
✏️ Poniższy program symuluje zabawkę Magic 8-Ball z 7 różnymi reakcjami. Zmień wiadomości na swoje ulubione i uruchom ponownie program wystarczająco dużo razy, aby upewnić się, że wszystkie wiadomości zostaną wyświetlone.
Liczby losowe w pseudokodzie
Istnieje wiele różnic w procedurach generujących liczby losowe w różnych językach programowania i bibliotekach.
Ten pseudokod reprezentuje częsty przypadek generowania liczby pomiędzy
start
i end
(włączając w to zarówno start
jak i end
):RANDOM(start, end)
Oto wersja pseudokodu kodu, który generuje 1 na 4 szanse:
val ← RANDOM(1, 4)
IF (val = 1 )
{
DISPLAY("1")
}
ELSE IF (val = 2 )
{
DISPLAY("2")
}
ELSE IF (val = 3 )
{
DISPLAY("3")
}
ELSE
{
DISPLAY("4")
}
🙋🏽🙋🏻♀️🙋🏿♂️Masz pytania związane z tym zagadnieniem? Możesz zadać swoje pytanie poniżej!
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji