Code snippets, ideas and events from IT related projects

by Robert Gawron

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:

diagram klas milionerzy

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:

Pingbacks

No pingbacks yet

Comments

No comments for this post

Leave your reply

Let me know what you think

Required. 30 chars of fewer.

Required.

captcha image