INSTRUKCJA DO ĆWICZENIA 5 Kontynuacja tworzenia aplikacje umożliwiających oszacowanie szukanych wartości przez symulację doświadczenia losowego, z ilustracją graficzną jego wyników. Zadanie wykonamy dla przykładów szacowania następujących wartości: 1. Prawdopodobieństwa trafienia do tarczy przez trzech strzelców. 2. Wartości oczekiwanej liczby trafień do tarczy. 3. Prawdopodobieństwo wylosowania dokładnie 3 liczb parzystych w lotto. 4. Prawdopodobieństwo, że z odcinków o losowych długościach można zbudować trójkąt. Przykład 1 Trzej strzelcy strzelają do tarczy oddając po jednym strzale. Prawdopodobieństwo trafienia dla pierwszego strzelca wynosi 0.7, dla drugiego 0.5, a dla trzeciego 0.6. Oszacować prawdopodobieństwo trafienia do tarczy przez wszystkich trzech strzelców. 1. Utwórz projekt wykorzystujący pakiet Swing. Projektowi nadaj nazwę Projekt51, a klasie głównej nazwę Strzelcy. 2. Nadaj ramce tytuł Strzelcy i na ramce umieść komponenty jak na rysunku obok: obszar jtextarea1 z opisem zadania dwa przyciski o tytułach Losuj i Restart tabelę jtable1 o 1 wierszu i 4 kolumnach; tytułami kolumn są kolejno Liczba strzałów, Liczba sukcesów, Oszacowanie wyniku, Wartość teoretyczna (odpowiednio określ właściwość model komponentu jtable1) Lewą górną część ramki pozostaw pustą, programowo utworzymy w niej panel, a na panelu umieścimy ilustrację graficzną doświadczenia. 3. Pod nagłówkiem klasy Strzelcy zadeklaruj pola: long lstrzałów, lsukcesów; final double W = 0.21; // wartość teoretyczna wyniku double wynik = 0; // oszacowanie wyniku double[] p = {0.7, 0.5, 0.6; //prawdopodobieństwa trafień kolejnych strzelców boolean[] s = new boolean[3]; // trafienia strzelców Color[] kolor = {Color.red, Color.blue, Color.green; //kolory przypisane kolejnym strzelcom 4. Ustal rozmiar ramki na 500x500 za pomocą metody setsize() 5. Utwórz metodę losowanie() która dla każdego z 3 graczy losuje liczbę rzeczywistą z przedziału [0, 1] i umieszcza w tablicy s wartość true albo false zależnie od tego czy strzelec trafił do tarczy s[i] = r.nextdouble() < p[i]; 6. Uzupełnij metodę losowanie o instrukcje sprawdzające czy doświadczenie losowe zakończyło się sukcesem oraz obliczające częstość tego sukcesu ( tu sukces oznacza, że każdy gracz musi trafić do tarczy). if (s[0] && s[1] && s[2]) //wszyscy strzelcy trafili do tarczy { lsukcesów++; jbutton1.setbackground(color.green); else { wynik = (double) lsukcesów / lstrzałów; // oszacowanie wyniku 7. Utwórz metodę start(), która określa stan początkowy dla serii losowań: lstrzałów = lsukcesów = 0; jtable1.setvalueat(0, 0, 0); jtable1.setvalueat(0, 0, 1); jtable1.setvalueat(null, 0, 2); // zerowanie liczników // usunięcie oszacowania wyniku s[i] = false; 8. Na końcu konstruktora klasy Strzelcy dopisz wywołanie metody start() oraz dodaj instrukcję wpisującą teoretyczną wartość wyniku do ostatniej komórki tabeli: start(); jtable1.setvalueat(w, 0, 3); // wartość teoretyczna do porównania Materiały do użytku wewnętrznego strona 1
9. Dla przycisku Losuj utwórz metodę obsługi zdarzenia actionperformed o treści: lstrzałów++; jtable1.setvalueat(lstrzałów, 0, 0); jtable1.setvalueat(wynik, 0, 2); // wpisanie do tabeli oszacowania wyniku 10. Dla przycisku Restart utwórz metodę obsługi zdarzenia actionperformed, w jej treści wywołaj metodę start() 11. Uruchom aplikację i sprawdź działania przycisków. 12. W celu graficznego zilustrowania pojedynczego doświadczenia utwórz klasę wewnętrzną o nazwie PanelGraficzny dziedzicząca z klasy JPanel zawierającą metodę paintcomponent o następujące treści: protected void paintcomponent(graphics g) { g.setcolor(color.pink); g.filloval(0, 0, 200, 200);//zarys tarczy g.setcolor(color.black); g.drawoval(0, 0, 200, 200);//zarys tarczy if (s[i]) { //rysowanie śladu kuli, gdy jest trafienie //d, a losowe współrzędne biegunowe punktu trafienia //x, y - współrzędne środka punktu trafienia double d = 90 * r.nextdouble(); double a = 2 * Math.PI * r.nextdouble(); int x = 100 + (int) (d * Math.sin(a)); int y = 100 + (int) (d * Math.cos(a)); g.setcolor(kolor[i]); g.filloval(x - 10, y - 10, 20, 20); 13. Pod nagłówkiem klasy Strzelcy zadeklaruj i utwórz obiekt klasy PanelGraficzny o nazwie panel. 14. W konstruktorze klasy głównej dodaj obiekt panel do ramki i za pomocą metody setbounds() ustal jego rozmiary i położenie tak, by miał rozmiar 205x205 i znajdował się w lewym górnym rogu ramki. 15. Aby po każdym kliknięciu przycisku Losuj nastąpiło odświeżenie grafiki, dodaj na końcu metody obsługującej to zdarzenie instrukcję: panel.repaint(); 16. Analogiczną instrukcję dodaj na końcu metody start() 17. Uruchom aplikację i zaobserwuj przebieg losowania. Przykład 2. Szacowanie wartości oczekiwanej. Szacowanie wartości oczekiwanej liczby trafień strzelców z przykładu 1 1. Kliknij prawym przyciskiem myszy na nazwie projektu i za pomocą opcji copy skopiuj Projekt51 na Projekt52. Zmień nazwę klasy głównej na StrzelcyW. W następnych krokach tak zmodyfikujemy Projekt52, by szacować wartość oczekiwaną liczby trafień. 2. Zmień wartość teoretyczną szacowanej wielkości W na 1.8, oraz zmień w tabeli tytuł liczba sukcesów na suma trafień 3. Pod nagłówkiem klasy zadeklaruj zmienną całkowitą suma, która posłuży do zliczania liczby wszystkich trafień do tarczy. 4. W metodzie losowanie() usuń całą instrukcję if związaną z wyznaczeniem liczby sukcesów; W pętli for dodaj instrukcję zwiększająca zmienną suma o jeden w przypadku, gdy strzelec trafi do tarczy. 5. W metodzie obsługującej kliknięcie przycisku Losuj, w metodzie losowanie() oraz w metodzie start() zastąp zmienną lsukcesów zmienną suma. 6. Uruchom aplikację, wielokrotnie wykonaj doświadczenie losowe i zaobserwuj zmiany szacowanej wartości. Przykład 3 Losowanie bez zwracania W grze lotto losujemy 6 liczb z 49. Oszacować prawdopodobieństwo, że dokładnie 3 z wylosowanych liczb są parzyste. Wartość teoretyczna prawdopodobieństwa to 0,33. 1. Utwórz projekt wykorzystujący pakiet Swing. Projektowi nadaj nazwę Projekt53, a klasie głównej nazwę Lotto. 2. Nadaj ramce tytuł Losowanie bez zwracania i w dolnej części ramki umieść komponenty jak na rysunku obok: Materiały do użytku wewnętrznego strona 2
3. Pod nagłówkiem klasy głównej zadeklaruj zmienne: long lgier, lsukcesów; double wynik; double W=0.33; int[] liczby = new int[6]; // wylosowane liczby 4. Ustal rozmiar ramki na 600x400 za pomocą metody setsize() 5. Utwórz metodę losowanie() która umieszcza na liście dynamicznej LK 49 kolejnych liczb całkowitych (Elementami listy muszą być obiekty klasy Integer). int s = 0; // licznik wylosowanych parzystych liczb List< Integer> LK = new ArrayList<>(); for (int i = 1; i <= 49; i++) { LK.add(i); 6. Uzupełnij powyższą metodę o losowanie 6 liczb z listy LK i umieszczenie ich w tablicy liczby; wylosowane liczby są następnie usuwane z listy LK; sprawdzana jest również parzystość wylosowanej liczby. int n = r.nextint(lk.size()); liczby[i] = LK.get(n); LK.remove(n); if (liczby[i] % 2 == 0) { s++; 7. Dopisz na końcu metody losowanie() instrukcje sprawdzające czy doświadczenie losowe zakończyło się sukcesem oraz obliczające prawdopodobieństwo tego sukcesu. (sukces oznacza wylosowanie 3 parzystych liczb): if (s == 3) { lsukcesów++; jbutton1.setbackground(color.green); else { wynik = (double) lsukcesów / lgier; 8. Utwórz metodę start(), która określa stan początkowy dla serii losowań: lgier = lsukcesów = 0; jtable1.setvalueat(0, 0, 0); jtable1.setvalueat(0, 0, 1); jtable1.setvalueat(null, 0, 2); liczby[i] = 0; // zerowanie liczników // usunięcie oszacowania wyniku 9. Na końcu konstruktora klasy Lotto dopisz wywołanie metody start() oraz dodaj instrukcję wpisującą teoretyczną wartość wyniku do ostatniej komórki tabeli: start(); jtable1.setvalueat(w, 0, 3); // wartość teoretyczna do porównania 10. Dla przycisku Losuj utwórz metodę obsługi zdarzenia actionperformed o treści: lgier++; jtable1.setvalueat(lgier, 0, 0); jtable1.setvalueat(wynik, 0, 2); 11. Dla przycisku Restart utwórz metodę obsługi zdarzenia actionperformed, w jej treści wywołaj metodę start() 12. Uruchom aplikację i sprawdź działania przycisków.. 13. W celu graficznego zilustrowania pojedynczego doświadczenia utwórz klasę wewnętrzną o nazwie PanelGraficzny dziedzicząca z klasy JPanel zawierającą metodę paintcomponent() o następujące treści: Materiały do użytku wewnętrznego strona 3
protected void paintcomponent(graphics g) { g.clearrect(0, 0, getwidth(), getheight()); int d = 30; // średnica kuli g.drawrect(10, 10, d * 6, 40); if (liczby[i] % 2 == 0) { g.setcolor(color.green); else { g.setcolor(color.yellow); if (liczby[i] == 0) { g.setcolor(color.white); g.filloval(d * i + 10, 15, d, d); g.setcolor(color.black); g.drawoval(d * i + 10, 15, d, d); if (liczby[i] > 0) { g.drawstring("" + liczby[i], d * i + 10 + 10, d + 5); 14. Pod nagłówkiem klasy Lotto zadeklaruj i utwórz obiekt klasy PanelGraficzny o nazwie panel. 15. W konstruktorze klasy głównej, dodaj obiekt panel do ramki i za pomocą metody setbounds() ustal jego rozmiary i położenie tak, by miał rozmiar 200x60 i żeby lewy górny róg panelu znajdował się w punkcie(100,100). 16. Aby po każdym kliknięciu przycisku Losuj nastąpiło odświeżenie grafiki, dodaj na końcu metody obsługującej to zdarzenie instrukcję: panel.repaint(); 17. Analogiczną instrukcje dodaj na końcu metody start() 18. Uruchom aplikację i zaobserwuj przebieg losowania. Przykład 4 Odcinek o długości L dzielimy w sposób losowy na trzy części. Oszacować prawdopodobieństwo, że z powstałych odcinków L1, L2, L3 można zbudować trójkąt. Warunek na utworzenie trójkąta z trzech odcinków o długościach odpowiednio L1, L2, L3 jest następujący: L1 + L2 > L3 i L1 + L3 > L2 i L2 + L3 > L1 1. Utwórz nowy projekt o nazwie Projekt54, klasę główną nazwij Odcinki. 2. Nadaj ramce tytuł Symulacja doświadczenia losowego i umieść na ramce komponenty jak na rysunku obok. W tabeli jtable2 będą wyświetlane wyniki pojedynczego doświadczenia (wylosowane punkty, długości trzech części odcinka). W tabeli jtable1 wyświetlimy wyniki serii doświadczeń i oszacowanie prawdopodobieństwa. 3. Pod nagłówkiem klasy Odcinki zadeklaruj następujące pola: long ldoświadczeń, lsukcesów; final double w = 0.25; // wartość teoretyczna wyniku double wynik = 0; // oszacowanie wyniku double L = 100; // długość odcinka, który dzielimy na 3 części double d1, d2, d3; // długości odcinków po podziale 4. W klasie Odcinki zdefiniuj metodę losowanie() w której umieścimy algorytm losowego podziału odcinka, zliczanie sukcesów oraz częstość sukcesu będącą szacowaniem szukanej wartości prawdopodobieństwa. double x1 = L * r.nextdouble(); //losowy punkt na odcinku o długości L double x2 = L * r.nextdouble();//losowy punkt na odcinku o długości L // wyznaczanie długości odcinków d1 = Math.min(x1, x2); d2 = Math.abs(x2 - x1); d3 = L - (d1 + d2); jtable2.setvalueat(x1, 0, 0); jtable2.setvalueat(x2, 0, 1); Materiały do użytku wewnętrznego strona 4
jtable2.setvalueat(d1, 0, 2); jtable2.setvalueat(d2, 0, 3); jtable2.setvalueat(d3, 0, 4); if (d1 + d2 > d3 && d1 + d3 > d2 && d2 + d3 > d1) { //warunek sukcesu lsukcesów++; jtable2.setbackground(color.yellow); else { jtable2.setbackground(color.white); wynik = (double) lsukcesów / ldoświadczeń; 5. Utwórz w klasie Odcinki metodę start(), która określa stan początkowy dla serii losowań: ldoświadczeń = lsukcesów = 0; //zerowanie liczników jtable1.setvalueat(0, 0, i); jtable1.setvalueat(w, 0, 3);//wartość teoretyczna do porównania 6. Wywołaj tą metodę w konstruktorze klasy głównej oraz w metodzie obsługi zdarzenia actionperformed dla przycisku Restart 7. Dla przycisku Losuj utwórz metodę obsługi zdarzenia actionperformed o treści: ldoświadczeń++; jtable1.setvalueat(ldoświadczeń, 0, 0); jtable1.setvalueat(wynik, 0, 2); 8. Uruchom aplikację i sprawdź działanie przycisków 9. Po wykonaniu całej instrukcji ćwiczenia, zaproponuj graficzną ilustrację doświadczenia, jako zadanie do samodzielnego wykonania. Wskazówka Jednym ze sposobów graficznej ilustracji doświadczenia może być wykreślenie na panelu kół o promieniach d1 i d3 i o środkach odpowiednio w punktach x1 i x2. Jeśli koła się przecinają, to oznacza, że można z uzyskanych odcinków zbudować trójkąt. Dodatkowo można go wykreślić korzystając z metody fillpolygon(), tak jak na rysunku. Przykładowe zadania na kolokwium 1 Opracować program umożliwiający ilustrację graficzną doświadczenia losowego i oszacowanie szukanej wartości 1. W lotto losujemy 6 liczb z 49.Oszacować prawdopodobieństwo, że wszystkie wylosowane liczby są mniejsze od 30 2. W windzie ośmiopiętrowego domu jedzie 5 pasażerów. Każdy z nich może wysiąść na każdym piętrze z jednakowym prawdopodobieństwem. Oszacować prawdopodobieństwo, że wszyscy wysiądą na różnych piętrach. 3. Z portfela w którym jest 5 banknotów po 20 zł, 3 po 50, i 2 banknoty po 100 zł wybieramy losowo 3 banknoty. Oszacować wartość oczekiwaną łącznej wartości wylosowanych banknotów. 4. W 3 komórkach rozmieszczamy w sposób losowy 4 różne cząstki tak długo aż dokładnie jedna komórka pozostanie pusta. Oszacować wartość oczekiwaną liczby losowań Materiały do użytku wewnętrznego strona 5