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

MZ | 01-06-2017 | 13:10:12

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!

Zobacz także

Daj się zaskoczyć! Poniżej wylosowałem dla Ciebie pięć wpisów z całego archiwum bloga:

Komentarze

Disqus
Facebook
Pasja informatyki