Główna zawartość
Programowanie
Kurs: Programowanie > Rozdział 5
Lekcja 2: Losowość- Błądzenie przypadkowe
- Wyzwanie: Losowy wędrowiec
- Prawdopodobieństwo i rozkłady niejednostajne
- Wyzwanie: Wędrowiec
- Rozkład normalny liczb losowych
- Wyzwanie: gaussowskie błądzenie przypadkowe
- Specjalny rozkład liczb losowych
- Wyzwanie: lot Levy'ego
- Projekt: spryskiwacz do farb
© 2023 Khan AcademyWarunki użytkowaniapolitykę prywatnościInformacja o plikach cookie
Prawdopodobieństwo i rozkłady niejednostajne
Pamiętacie, gdy zaczynaliście tu programować? Prawdopodobnie chcieliście narysować wiele kółek na ekranie. Więc pewnie stwierdziliście: “ Już wiem. Narysuję mnóstwo okręgów w losowych miejscach, o losowych rozmiarach i losowych kolorach.” W systemach grafiko komputerowej bardzo łatwo jest wypełnić system za pomocą losowości. Jednak podczas tych lekcji staramy się zbudować system oparty na tym, o widzimy w naturze. Uznawanie, że losowość jest domyślnym rozwiązaniem to niezbyt przemyślane rozwiązanie problemów projektowania—szczególnie podczas tworzenia organicznych lub realistycznie-wyglądających symulacji.
Za pomocą kilku sztuczek możemy zmienić sposób w jaki używamy
random()
aby stworzyć “niejednostajny” rozkład liczb losowych. Przyda się to podczas tego kursu, gdyż będziemy rozważać wiele różnych możliwych scenariuszy. Gdybyśmy badali algorytmy genetyczne, potrzebowalibyśmy dla przykładu sposobu na dokonanie “selekcji”—którzy z członków naszej populacji powinni być wybrani do przekazania swojego DNA następnemu pokoleniowi? Pamiętacie koncepcję tego, że przetrwają tylko najsilniejsi? Powiedzmy, że mamy ewoluującą populację małp. Nie wszystkie małpy mają równe szanse na reprodukcję. Aby zrobić symulację ewolucji według Darwina, nie możemy po prostu wybrać dwie losowe małpy jako rodziców. Musimy sprawić, aby te “silniejsze” były częściej wybierane. Musimy zdefiniować “prawdopodobieństwo bycia najsilniejszym.” Dla przykładu, bardzo szybkie i silne małpy mogą mieć 90% szansy na reprodukcję, podczas gdy te słabsze tylko 10%.Zatrzymajmy się w tym momencie na chwilę aby przypomnieć sobie podstawowe zasady prawdopodobieństwa. W pierwszej kolejności badamy prawdopodobieństwo pojedynczego zjawiska, czyli prawdopodobieństwo, że to właśnie się wydarzy.
Jeżeli mamy system w którym istnieje pewna liczba określonych wyników oraz każdy wynik jest tak samo prawdopodobny, to prawdopodobieństwo jednego z nich jest równe liczbie wszystkich możliwości wystąpienia tego wyniku podzielonej przez całkowitą liczbę przypadków. Rzut monetą to prosty przykład—ma tylko dwa możliwe wyniki, orła lub reszkę. Istnieje tylko jeden sposób na wyrzucenie orła. Prawdopodobieństwo, że wypadnie orzeł wynosi więc 1 podzielone przez 2: 1/2 albo 50%.
Weźmy talię pięćdziesięciu dwóch kart. Prawdopodobieństwa wybrania asa z talii wynosi:
liczba asów / liczba kart = 4 / 52 = 0.077 = ~ 8%
Prawdopodobieństwo wyrzucenia karo wynosi:
liczba kart z symbolem karo / liczba kart = 13 / 52 = 0.25 = 25%
Możemy również obliczyć prawdopodobieństwo wystąpienia wielu zdarzeń po kolei. Aby to zrobić, po prostu mnożymy przez siebie prawdopodobieństwa poszczególnych zdarzeń.
Prawdopodobieństwo wyrzucenia orła trzy razy pod rząd wynosi:
(1/2) * (1/2) * (1/2) = 1/8 (albo 0,125)
To oznacza, że średnio orzeł wypadnie trzy razy pod rząd raz na osiem razy (gdzie każdy “raz” oznacza trzy rzuty).
Chcecie utrwalić sobie prawdopodobieństwo przed kontynuowaniem? Przejrzyjcie zdarzeniom złożonym i prawdopodobieństwu zdarzeń zależnych.
Istnieje kilka sposobów na wykorzystanie funkcji
random()
z prawdopodobieństwem w kodzie. Jednym ze sposobów jest wypełnienie tablicy liczbami—z których niektóre się powtarzają—i wybrać losowe z nich i wygenerować zdarzenia na podstawie tych wyborów.Ten kod daje 40% szansy na wybranie wartości 1, 20% na wybranie wartości 2 i 40% na wybranie wartości 3.
Możemy również zapytać funkcję o losowa wartość(dla ułatwienia uznajmy, że chcemy otrzymać losową liczbę z przedziału 0 i 1) i pozwolić na wystąpienie jakiegoś zdarzenia tylko wtedy, gdy nasza wartość jest z określonego przedziału. Zobaczcie poniższy przykład i klikajcie restart do momentu, gdy losowo wybrana cyfra w końcu będzie poniżej progu:
Ta metoda może być używana do wielu różnych wyników. Powiedzmy, że Wynik A wystąpi na 60%, Wynik B na 10% a wynik C na 30%. Zaimplementujemy to w kodzie poprzez wybranie losowej liczby i sprawdzenie, do którego przedziału się zalicza.
- pomiędzy 0,00 a 0,60 (60%) –> Wynik A
- pomiędzy 0,60 a 0,70 (10%) –> Wynik B
- pomiędzy 0,70 a 1,00 (30%) –> Wynik C
Uruchom aplikację kilka razy, aby sprawdzić jak często otrzymasz inne wyniki:
Możemy użyć tego sposobu do zmuszenia naszego obiektu Walker do częstszego przemieszczania się w prawo. Oto przykład
Walker
a z następującymi prawdopodobieństwami:- prawdopodobieństwo ruchu w górę: 20%
- prawdopodobieństwo ruchu w dół: 20%
- prawdopodobieństwo ruchu w lewo: 20%
- prawdopodobieństwo ruchu w prawo: 40%
Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji