Generowanie losowych liczb w PHP bez powtórzeń (funkcja losująca).

Z Podręcznik Administratora by OPZ SGU
Wersja z dnia 17:23, 15 lut 2018 autorstwa Adminka23 (dyskusja | edycje) (Zastępowanie tekstu - "</source>" na "</pre>")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

Dzisiaj kodując napotkałem na problem związany z generowaniem pseudo losowych liczb, bez powtórzeń.

Oficjalnie PHP nie posiada w sobie takiego mechanizmu więc zacząłem poszukiwania na google hasłem "jak wylosować liczby bez powtórzeń w php".

Niestety żaden pierdolony buc jej nie udostępnił w postaci gotowej (prawdopodobnie uznał że korona mu z głowy spadnie) tak więc wymaganą funkcję musiałem utworzyć samemu.


Poniżej mój gotowiec, wykorzystujący rekurencję.

function wylosuj_liczby_bez_powtorzen($najmniejsza,$najwieksza,$ilosc,$wykluczone='',$i='0')
 {
 for ($petla=$i;$petla<$ilosc;$petla++)
 {
 $losowa=rand($najmniejsza,$najwieksza);
 if ($wykluczone[$losowa]==$losowa)
 {
 return wylosuj_liczby_bez_powtorzen($najmniejsza,$najwieksza,$ilosc,$wykluczone,$petla);
 }
 else
 {
 $wykluczone[$losowa]=$losowa;
 print(">>$losowa<<<br>");
 }
 }
}


Przykład użycia

wylosuj_liczby_bez_powtorzen(1,50,15);
  • 1 - losuj liczby od jeden
  • 50 - do pięćdziesiąt
  • 15 - wylosowanych liczb ma być 15


Efekt finalny

>>45<<
>>38<<
>>6<<
>>23<<
>>16<<
>>35<<
>>9<<
>>29<<
>>15<<
>>4<<
>>11<<
>>21<<
>>50<<
>>48<<
>>8<<