Instrukcja warunkowa IF
Treść obu stworzonych uprzednio plików (monty_uparciuch.m
oraz monty_niestateczny.m
) w znacznym stopniu się pokrywa. Różnica pomiędzy nimi polega na tym, że w jednym przypadku gracza stawia się przed możliwością zmiany wyboru bramki i gracz z tej propozycji korzysta, w drugim pozostaje on przy swoim pierwotnym wyborze. Dołożymy do kodu zawartego w monty_niestateczny
dodatkową część, która będzie uzależniała przebieg algorytmu od zdefiniowanych warunków – w naszym przypadku takim warunkiem będzie wybór strategii, jaką obrał gracz.
Zacznijmy od zapisania skryptu monty_niestateczny
pod nową nazwą, niech to będzie po prostu monty
.
- Otwórz do edycji plik
monty_niestateczny
, po czym zapisz go pod nową nazwą.
Teraz możesz przejść do wprowadzania zmian. Strategię gracza ustalamy „na sztywno”, przed główną pętlą programu.
- Zdefiniuj na początku skrytpu nową zmienną strategia_gracza , przypisz jej wartość 1.
strategia_gracza = 1
Umawiamy się od razu, że wartość 1 oznaczać wybór strategii uparciucha. W samej pętli for
dokonujemy większej zmiany. Na miejsce linii
drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]);
Wstaw cały blok instrukcji:
if strategia_gracza == 1 drugi_wybor = pierwszy_wybor; else drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]); end
Powyższy blok kodu będzie interpretowany w następujący sposób: Jeśli zmienna strategia_gracza przyjmie wartość 1, warunek strategia_gracza == 1
zostanie spełniony i MATLAB zacznie wykonywać instrukcję znajdujące się bezpośrednio pod linią z if
. W przeciwnym wypadku (jeśli strategia_gracza przyjmie wartość 0, 2, 8 czy jakąkolwiek inną) MATLAB wykona instrukcję znajdujące się bezpośrednio pod linią z else
. Program będzie działał, można go jednak nieco poprawić. Ponieważ w grze można przyjąć jedną z dwóch strategii (tj. uczestnik turnieju ma dwie opcje: zostać przy pierwszym wyborze lub go zmienić) warto zadbać, by miało to odzwierciedlenie w kodzie. Jak na razie strategia uparciucha została oznaczona konkretnie, przy pomocy liczby 1, natomiast strategia niestatecznego jest przyjmowana przy podaniu dowolnej innej wartości. Zmieńmy to teraz modyfikując blok if - else
if strategia_gracza == 1 drugi_wybor = pierwszy_wybor; elseif strategia_gracza == 2 drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]); else error('Nieprawidłowe wskazanie strategii gracza') end
Podobnie jak w poprzednim przypadku, w pierwszej kolejności dokonywane jest sprawdzenie, czy zmienna strategia_gracza przyjęła wartości 1. Jeśli nie, to sprawdzane jest, czy strategia_gracza przyjęła wartości 2. Jeśli wynik tego sprawdzenie również jest negatywny, wykonywany jest kod zapisane bezpośrednio pod else
. W naszym przypadku będzie to przerwanie działania programu i wyświetlenie informacji o błędzie.
Całość pliku monty.m
powinna wyglądać następująco:
strategia_gracza = 1 liczba_gier = 10000; liczba_wygranych = 0; for i = 1:liczba_gier bramki = [false false false]; bramka_z_nagroda = randi(3); % polecenie losuję liczbę naturalną w zakresie 1 - 3 bramki(bramka_z_nagroda) = true; pierwszy_wybor = randi(3); numery_bramek = [1 2 3]; numery_pustych_bramek = setdiff(numery_bramek, pierwszy_wybor); opcje_prowadzacego = setdiff(numery_pustych_bramek, bramka_z_nagroda); wskazanie_prowadzacego = opcje_prowadzacego(1); if strategia_gracza == 1 drugi_wybor = pierwszy_wybor; elseif strategia_gracza == 2 drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]); else error('Nieprawidłowe wskazanie strategii gracza') end wygrana = bramki(drugi_wybor); liczba_wygranych = liczba_wygranych + wygrana; end p_wygranej = liczba_wygranych / liczba_gier
Kod na pewno nie jest "optymalny". Ma jednak jedną dużą zaletę: jest czytelny. I to jest olbrzymia zaleta MATLABa.