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ść

Program, wykonujący prostą symulację

Słyszałeś kiedyś bajkę o żółwiu i zającu?
Zając drwi sobie z żółwia, że porusza się tak wolno i wyzywa go do wyścigu. W wyścigu zając pędzi naprzód, ale widząc, że jest tak daleko do przodu, ucina sobie drzemkę. Zając budzi się, aby odkryć, że żółw powoli, ale z pewnością go pokonał. 🐢> 🐇 !
Ilustracja przedstawiająca żółwia przechodzącego obok zająca, który śpi w krzakach.
Ilustracja z książki dla dzieci. Źródło obrazu: Project Gutenberg
Bajka zainspirowała ludzi do organizowania prawdziwych wyścigów pomiędzy żółwiami i zającami. Nie mam takich zwierząt pod ręką, ale jestem ciekaw, czy to naprawdę możliwe: czy żółw może pokonać sennego zająca? Jak szybki musi być żółw i jak senny musi być zając?
Zbadamy pytania poprzez zaprogramowanie symulacji.

Zaczynając od prostego

Zaczniemy od symulacji wyścigu między żółwiem a zającem, który nie drzemie. Myślę, że oboje znamy wyniki tego wyścigu, ale kiedy programujemy, łatwiej jest zacząć od prostszego problemu, a potem dodać do niego złożoność.
Najpierw musimy ustalić pewne warunki początkowe:
  • Czas trwania wyścigu
  • Średnia prędkość żółwia
  • Średnia prędkość zająca
Musimy również śledzić niektóre wartości, które będą się zmieniać w trakcie wyścigu:
  • Aktualna pozycja żółwia
  • Aktualna pozycja zająca
Możemy przechowywać zarówno warunki początkowe jak i zmienne wartości w zmiennych.
Oto kod JavaScript, który inicjalizuje te zmienne:
var tortoiseSpeed = 1;
var hareSpeed = 2;
var raceDistance = 350;

var tortoisePos = 0;
var harePos = 0;
Następnie możemy użyć pętli, która aktualizuje pozycję żółwia i zająca i zatrzymuje się tylko wtedy, gdy jeden z nich dotrze do mety.
while (tortoisePos < raceDistance && harePos < raceDistance) {
    tortoisePos += tortoiseSpeed;
    harePos += hareSpeed;
}
Oto symulacja z użyciem tego kodu:
📝 Zobacz podobny kod w: App Lab | Snap | Python
Dopóki zając jest szybszy od żółwia, będzie wygrywał ten wyścig. Teraz gdy to działa, nadszedł czas, by uczynić to bardziej interesującym.

Dodanie złożoności

Nasza symulacja musi modelować zachowanie leniwego zająca. Możemy zacząć od ustalenia pewnych początkowych cech jego lenistwa:
  • Jak długo zazwyczaj nie śpi między drzemkami?
  • Kiedy drzemie, jak długo to trwa?
Oto kod JavaScript, który przechowuje te właściwości jako zmienne:
var minsBetweenNaps = 30; 
var napLength = 20;
Aby dowiedzieć się, kiedy zatrzymać zająca na czas drzemki, musimy również śledzić niektóre wartości:
  • Ile czasu minęło od ostatniej drzemki?
  • Skoro w tej chwili drzemie, to ile czasu minęło od rozpoczęcia drzemki?
Ten kod przechowuje wartości początkowe tych zmiennych:
var minsSinceLastNap = 0;
var minsSinceNapStart = 0;
Zając na początku nie drzemie i biegnie, więc obie zmienne zaczynają się od 0.
Na koniec, musimy dodać logikę w pętli, aby zając uciął sobie drzemkę.
Jeśli zając nie musi jeszcze drzemać, kod aktualizuje pozycję zająca (jak poprzednio) i zwiększa minsSinceLastNap:
if (minsSinceLastNap <= minsBetweenNaps) {
    harePos += hareSpeed;
    minsSinceLastNap++;
}
Jeśli zając powinien drzemać, kod zwiększa minsSinceNapStart, a gdy zając zakończy drzemkę, resetuje minsSinceLastNap i minsSinceNapStart do 0:
else {
     if (minsSinceNapStart < napLength) {
          minsSinceNapStart++;
      } else {
          minsSinceLastNap = 0;
          minsSinceNapStart = 0;
      }
}
Sprawdźmy kod razem w poniższej symulacji. Który zawodnik wygrywa? Jak można zmienić parametry, aby drugi zawodnik wygrał?
📝 Zobacz podobny kod w: App Lab | Snap | Python

Wizualizacja zmian

Symulacja nie musi mieć wyjścia wizualnego; może po prostu mieć wyjście tekstowe lub liczbowe, jak symulacje powyżej. Jednakże wizualizacja może pomóc użytkownikom symulacji w bardziej intuicyjnym zrozumieniu danych wyjściowych.
Sposób, w jaki dodamy komponent wizualny do symulacji komputerowej, zależy od języka, którego używamy i od tego, jakie biblioteki mamy do dyspozycji. W środowisku kodowania Khan Academy możemy wykorzystać bibliotekę ProcessingJS do rysowania i animowania kształtów na ekranie, dzięki czemu doskonale nadaje się ona do wizualizacji tej symulacji.
Symulacja ta działa w oparciu o tę samą logikę co poprzednio, ale dodaje wizualizację:
📝 Zobacz podobny kod w: App Lab | Snap | Python

Dodanie zmienności

Prawdziwy świat jest pełen wariacji. Żółwie i zające różnią się prędkością; najwolniejszy żółw porusza się z prędkością 0,3 km/h, a najszybszy z prędkością 5 km/godz. Ponadto w ramach wyścigu żółw i zając nie będą poruszać się z dokładnie tą samą prędkością przez cały czas; będą mieli swoje szybkie i powolne momenty.
Jednym ze sposobów na dodanie wariacji do symulacji jest wygenerowanie liczb losowych. Możemy dowiedzieć się, jakie są oczekiwane zakresy wartości w świecie rzeczywistym i wygenerować wartości w tych zakresach.
Spróbuj znaleźć wszystkie miejsca, które używają losowo wygenerowanych liczb w tej wersji symulacji, a następnie uruchom ponownie, aby zobaczyć, co się zmienia:
📝 Zobacz podobny kod w: App Lab | Snap | Python
Zauważ, że ta symulacja wykorzystuje bardziej realistyczne liczby dla prędkości zająca w porównaniu z żółwiem, więc możesz być trochę zszokowany wynikami. Pobaw się parametrami drzemki, aby sprawdzić, czy możesz dać żółwiowi szansę na wygranie wyścigu.

Co jest pominięte?

Symulacja ta jest abstrakcją scenariusza świata rzeczywistego. Próbuje się w niej zawrzeć najważniejsze parametry scenariusza, ale nie może ona obejmować wszystkiego.
Oto kilka pomysłów na pominięcie szczegółów, które mogą mieć wpływ na wyścig:
  • czy każdy zawodnik porusza się po prostej ścieżce, czy też meandruje
  • czy każdy zawodnik ma kalorie niezbędne do kontynuowania wyścigu
  • czy któryś z zawodników ryzykuje przegrzaniem podczas wyścigu
🤔 Czego jeszcze brakuje w symulacji? W jaki sposób symulacja mogłaby być bardziej realistyczna? Jakie parametry pozwoliłyby nam zbadać więcej możliwości?

🙋🏽🙋🏻‍♀️🙋🏿‍♂️Masz pytania związane z tym zagadnieniem? Możesz zadać swoje pytanie poniżej!