Optymalna kolejność wykorzystania kół ratunkowych
Mamy wszystkie koła ratunkowe i pytanie, na które nie znamy odpowiedzi. Chcemy wykorzystać 50:50 i pomoc publiczności ale w jakiej kolejności to zrobić? Taka dyskusja rozgorzała na joemoster...
Oba warianty mają swoje plusy, postanowiłem więc napisać model takiej sytuacji i przetestować w praktyce. Program pokazuje, jakie jest prawdopodobieństwo, że wygramy jeżeli w pełni zdamy się na odpowiedzi publiczności, w zależności od tego, czy 50:50 wykorzytamy przed, czy po głosowaniu publiczności.
Początkowo chciałem to napisać w bashu albo perlu ale jako, że to model czegoś, to pasował bardziej język 'soczyście' obiektowy, np. Java.
Poniżej diagram klas UML:
Poniżej znajduje się kod źródłowy. Napisałem dużo komentarzy, IMHO kod jest czytelny, więc nie będę go wyjaśniał. Na końcu posta są linki do pobrania wszystkich plików.
1 import java.util.*; 2 3 class Tura { 4 // interfejs klasy 5 public Tura(){ 6 // tworzymy odpowiedzi do pytania 7 odp = new Odpowiedz[4]; 8 for(int i=0; i<ile_odpowiedzi; i++) { 9 odp[i] = new Odpowiedz(); 10 } 11 // ustawiamy poprawna odpowiedz, jst ona 12 // na losowym miejscu, tzn nie ma tak, ze 13 // np. poprawne odpowedzi sa zazwyczaj A 14 this.ustaw_poprawna(); 15 } 16 public boolean glos_gracza(){ 17 // gracz wybira odpowiedz najwyzej punktowana 18 // przez widzow, jezeli kilka bylo tak samo 19 // punktowanych to wybiera pierwsza z brzegu 20 // why not? jezeli wygral zwracamy true 21 int id_najlepszej = 0; 22 int ile_najwiecej = 0; 23 for(int i=0; i< odp.length; i++) { 24 if(odp[i].ilosc_glosow > ile_najwiecej) { 25 id_najlepszej = i; 26 ile_najwiecej = odp[i].ilosc_glosow; 27 } 28 } 29 return (id_najlepszej == id_poprawnej) ? true : false; 30 } 31 public String pokaz_ture(boolean pokaz_procenty) { 32 String ekran = ""; 33 String poz = ""; 34 for(int i=0; i< ile_odpowiedzi; i++){ 35 // musimy mie naczek nowej lini, by byly 36 // kolumny i wiersze, jak w TV 37 if(i%2==0 && i!=0) { 38 ekran += "\n"; 39 } 40 if(odp[i].czy_aktywne) { 41 poz = odp[i].czy_poprawne ? "poprawna" : "zla "; 42 if(pokaz_procenty) { 43 poz = "(" + odp[i].ilosc_glosow + ")" + poz; 44 } 45 } 46 else{// pozycja juz odpadla w pol na pol 47 poz = "< >"; 48 } 49 ekran += poz + "\t"; 50 } 51 return ekran; 52 } 53 public void pol_na_pol() { 54 // to na razie dziala tylko dla 4 odpowiedzi 55 Random gen = new Random(); 56 for(int ile_skreslonych=0; ile_skreslonych<(int)ile_odpowiedzi/2; ){ 57 int ans = gen.nextInt(ile_odpowiedzi); 58 if( odp[ans].czy_poprawne==false 59 && odp[ans].czy_aktywne==true ) { 60 // ta odpowiedz mozna skreslic 61 odp[ans].czy_aktywne = false; 62 ile_skreslonych++; 63 } 64 } 65 } 66 public void glos_publicznosci() { 67 Publicznosc.glosuj(odp); 68 } 69 // wewnetrzne dane i metody 70 private void ustaw_poprawna(){ 71 Random gen = new Random(); 72 id_poprawnej = gen.nextInt(ile_odpowiedzi); 73 odp[ id_poprawnej ].czy_poprawne = true; 74 } 75 private Odpowiedz odp[]; 76 private static int ile_odpowiedzi = 4; 77 private static int id_poprawnej; 78 } 79 80 class Publicznosc { 81 public static void glosuj(Odpowiedz odp[]){ 82 Random gen = new Random(); 83 // sprawdzmy ile jest mozliwych odpowiedzi 84 // do zaglosowania na nie i jaka jest poprawna 85 int ile_aktywnych=0; 86 int id_poprawnej = 0; 87 for(int i=0; i< odp.length; i++) { 88 ile_aktywnych++; 89 if(odp[i].czy_poprawne) { 90 id_poprawnej = i; 91 } 92 } 93 // kazdy widz glosuje 94 for(int i=0; i< ile_widzow; i++){ 95 // czy widz zaglosuje na poprawna odpowiedz? 96 int f1 = gen.nextInt(100);// 100 bo 100% 97 // ok, widz zaglosowal poprawnie 98 if( f1<= wiedza ){ 99 odp[id_poprawnej].ilosc_glosow++; 100 } 101 // nie wiedzial - strzela 102 else{ 103 boolean oddal_glos= false; 104 while(!oddal_glos) { 105 int f2 = gen.nextInt( odp.length ); 106 if(odp[f2].czy_aktywne){ 107 odp[f2].ilosc_glosow++; 108 oddal_glos=true; 109 } 110 } 111 } 112 } 113 // mamy liczbe glosow na dana odpowiedz, a 114 // chcemy procenty, znow pentelka.. 115 for(int i=0; i< odp.length; i++) { 116 odp[i].ilosc_glosow = (int)(odp[i].ilosc_glosow*100 / ile_widzow); 117 } 118 } 119 // ile ludzi na 100 zna odpowiedz? BTW okazuje sie ze 120 // przy duzej licznie ludzo ten wskaznik moze byc 121 // bardzo maly, a publicznosc i tak wskaze poprawnie! 122 public static int wiedza = 10; 123 public static int ile_widzow = 120; 124 } 125 126 class Odpowiedz { 127 public Odpowiedz(){ 128 czy_aktywne = true; 129 czy_poprawne = false; 130 ilosc_glosow = 0; 131 } 132 // akcesory, motatoty etc, nie chcailo mi sie 133 // tego pisac wiec jest zywcem dostep jako 134 // publiczne pola - kod i tak nie bedzie 135 // rozwijany, to po co sie silic? 136 public boolean czy_aktywne; 137 public boolean czy_poprawne; 138 public int ilosc_glosow; 139 } 140 141 class Main { 142 public static void main(String[] args) { 143 ile_trafionych = 0; 144 for(int i=0; i<ile_prob; i++) { 145 tura = new Tura(); 146 tura.pol_na_pol(); 147 tura.glos_publicznosci(); 148 if( tura.glos_gracza() ) { 149 ile_trafionych++; 150 } 151 } 152 System.out.println("50:50, publicznosc: "+ (double)ile_trafionych/ile_prob); 153 154 ile_trafionych = 0; 155 for(int i=0; i<ile_prob; i++) { 156 tura = new Tura(); 157 tura.glos_publicznosci(); 158 tura.pol_na_pol(); 159 if( tura.glos_gracza() ) { 160 ile_trafionych++; 161 } 162 } 163 System.out.println("publicznosc, 50:50: "+ (double)ile_trafionych/ile_prob); 164 } 165 166 static void info(){ 167 System.out.println("------------------------------------------"); 168 System.out.println( tura.pokaz_ture(true) ); 169 System.out.println("------------------------------------------"); 170 System.out.println("WYNIK: " + tura.glos_gracza() ); 171 172 } 173 static int ile_trafionych; 174 static int ile_prob = 1000000; 175 static Tura tura; 176 }
Jaka jest odpowiedz? Jak bardziej opłaca się grać? Nie powiem, niech czytelnik sam odpali to u siebie i ew. wprowadzi swoje poprawki do modelu. Tjaaa, jestem wredny :)
Całość można też rozważyć teoretycznie. 50:50 zmniejsza ilość możliwości, które ma do wyboru publiczność. Dla 1 możliwości publiczność zawsze miała by racje, zawsze byśmy wygrywali polegając na niej. Dla nieskończenie wielu poprawność była by mniejsza. Idąc tym tropem wychodzi na to, że warto by publiczności ułatwić zadanie na wstępie biorąc 50:50.
Materiały do pobrania:
- Kod źródłowy, kompilujemy:
javac Main.java
, uruchamiamy:java Main
- Plik XML, programu Umbrello z diagramem klas