Losowanie bez powtórzeń w PHP i C++. Gra Milionerzy

2013-06-25 | Mirosław Zelent

W wolnej chwili udało mi się ukończyć quiz z programowania o nazwie Milionerzy. Rozgrywka, jak nietrudno się domyślić, wzorowana jest na popularnym teleturnieju o tej samej nazwie. Nie ma nic przyjemniejszego niż połączyć przyjemne z pożytecznym i uczyć się w czasie gry. Przyjdzie nam pogłówkować nad pytaniami zadawanymi przez trzech komputerowych nerdów:

  1. $ile_pytan = 20; //z ilu pytań losujemy?
  2. $ile_wylosowac = 5; //ile pytań wylosować?
  3. $ile_juz_wylosowano=0; //zmienna pomocnicza
  4.  
  5. for ($i=1; $i<=$ile_wylosowac; $i++)
  6. {
  7. do
  8. {
  9. $liczba=rand(1,$ile_pytan); //losowanie w PHP
  10. $losowanie_ok=true;
  11.  
  12. for ($j=1; $j<=$ile_juz_wylosowano; $j++)
  13. {
  14. //czy liczba nie została już wcześniej wylosowana?
  15. if ($liczba==$wylosowane[$j]) $losowanie_ok=false;
  16. }
  17.  
  18. if ($losowanie_ok==true)
  19. {
  20. //mamy unikatową liczbę, zapiszmy ją do tablicy
  21. $ile_juz_wylosowano++;
  22. $wylosowane[$ile_juz_wylosowano]=$liczba;
  23. }
  24. } while($losowanie_ok!=true);
  25. }

W rezultacie wykonania kodu otrzymujemy tablicę o nazwie $wylosowane[] zawierającą 5 unikatowych numerów pytań (w indeksach od 1 do 5). Kluczowym momentem algorytmu jest każdorazowe sprawdzenie, czy przypadkiem właśnie wylosowany z przedziału numer pytania nie znajduje się już w tablicy $wylosowane[] (linia nr 15). Jeśli tak, zmienna $losowanie_ok przyjmuje wartość false, co sprawia, że wylosowana liczba nie zostanie zapisana po raz drugi do tablicy. Zaś dzięki zewnętrznej pętli do..while nastąpi kolejna próba losowego wybrania unikatowej liczby.

Analogicznie wygląda to w języku C++. Przygotowałem dwa pliki do pobrania, zawierające oprócz algorytmu także mini wersję demonstracyjną (aby móc zobaczyć rezultaty algorytmu na ekranie):