If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Generowanie 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:
Oś liczbowa z wypełnionym kółkiem na 0 i pustym kółkiem na 1, oraz wypełnioną linią pomiędzy kółkami.
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):
Linia numeryczna z wypełnionym kółkiem na 0 i pustym kółkiem na 6, oraz wypełnioną linią pomiędzy kółkami.

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:
Oś liczbowa z wypełnionymi kółeczkami na 0, 1, 2, 3, 4, 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:
Ilustracja 6 kostek, od 1 kropki do 6 kropek.
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!");
}
📝 Zobacz podobny kod w: App Lab | Snap | Python
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");
}
📝 Zobacz podobny kod w: App Lab | Snap | Python
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.
📝 Zobacz podobny kod w: App Lab | Snap | Python

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
Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.