Losowanie bez powtórzeń w PHP i C++. Gra Milionerzy
To częste pytanie: jak wylosować wartości z pewnego zbioru (tablicy wartości) w taki sposób, aby żadna z nich nie powtórzyła się? Dziś przedstawiam realizację takiego algorytmu w języku PHP oraz C++. Pojawi się też bonus w postaci mini-gry napisanej w PHP. Oto algorytm losowania bez powtórzeń w PHP:
$ile_pytan = 20; //z ilu pytan losujemy?
$ile_wylosowac = 5; //ile pytan wylosowac?
$ile_juz_wylosowano=0; //zmienna pomocnicza
for ($i=1; $i<=$ile_wylosowac; $i++)
{
do
{
$liczba=rand(1,$ile_pytan); //losowanie w PHP
$losowanie_ok=true;
for ($j=1; $j<=$ile_juz_wylosowano; $j++)
{
//czy liczba nie zostala juz wczesniej wylosowana?
if ($liczba==$wylosowane[$j]) $losowanie_ok=false;
}
if ($losowanie_ok==true)
{
//mamy unikatowa liczbe, zapiszmy ja do tablicy
$ile_juz_wylosowano++;
$wylosowane[$ile_juz_wylosowano]=$liczba;
}
} while($losowanie_ok!=true);
}
// ZOBACZ REZULTATY LOSOWANIA
echo "Wylosowane numery: ";
for ($i=1; $i<=$ile_wylosowac; $i++)
{
echo $wylosowane[$i]." ";
}
W rezultacie wykonania kodu otrzymujemy tablicę o nazwie $wylosowane[]
zawierającą 5 unikatowych numerów pytań (tutaj 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[]
. 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 dwie paczki ZIP do pobrania, zawierające oprócz algorytmu także mini wersję demonstracyjną (aby móc zobaczyć rezultaty algorytmu na ekranie).
Dodatkowo, 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!
Komentarze