PHP, liczby losowe i brak pokory w stosunku do manuala

Natknąłem się dzisiaj na bardzo ciekawy efekt pseudolosowości przez duże P. Musiałem wygenerować 500 tysięcy unikatowych, ośmiocyfrowych liczb. Niby nic trudnego, funkcja rand, tablica lub baza do przechowywania informacji oraz nieskończona pętla, która mieli tak długo, aż wygeneruje wszystkie liczby. Okazało się jednak, że coś co miało zająć 15 minut zajęło mi godzinę. A wszystko przez to, że myślałem, iż jestem mądrzejszy od manuala.

Mój generator z uporem maniaka losował te same 32 768 liczb z przedziału 10 000 000 – 99 999 999. Nie ważne ile razy bym nie uruchamiał skryptu, liczby za każdym razem były te same. I tutaj pokłoniłem się przed manualem, który powinienem był przeczytać na samym początku, a nie myśleć, że wiem lepiej. Okazało się, że na Windows losowość w PHP ma ograniczenie na 32 768 wartości, czyli 215 ze znakiem, czyli 2 bajty. Kolejny ukłon w stronę manuala – zamiast funkcji rand trzeba użyć mt_rand. Funkcja ta ma znacznie większy zakres unikatowych liczb, które może wygenerować i wynosi on 2 147 483 648, czyli 231 ze znakiem, czyli 4 bajty.

Z tej lekcji wyciągnąłem dwa wnioski:

  1. Do losowania liczb lepiej korzystać z funkcji mt_rand.
  2. Zanim zacznie się robić coś, czego od dłuższego czasu się nie robiło, lepiej wpierw poszukać informacji o ewentualnych zmianach, a nie przeklinać “ten głupi język”. Innymi słowy RTFM.
  1. po co ci 500 tysiecy unikalnych liczb? :>

  2. pewnie po to, zeby taki fajny wpis na blogu splodzic ;)

  3. Też nie wiem po co ;) Po prostu musiałem wygenerować taką ilość.

  4. faktycznie amerykę odkryłeś. Korzystanie z mt_rand było zalecane już w PHP4

  5. ~Anonimowy
    Nie napisałem, że odkryłem Amerykę. Zobacz drugi punkt we wnioskach.

  6. "nieskończona pętla, która mieli tak długo, aż…" – Zabawne zdanie logicznie i językowo.

  7. Nie znam zbyt dobrze biblioteki PHP ale po przeczytaniu notki myślę, że można było użyć zwykłego randa. Dla każdej liczby trzeba by go było użyć dwukrotnie, a obie wylosowane liczby skleić ze sobą (przesunięcia bitowe + dodawanie).

  8. Można, ale po co? Jeśli jest funkcja, która ma większy zakres, to lepiej z niej skorzystać, niż tworzyć nowy mechanizm.

  9. To była luźna dygresja, nie przeczę, że lepiej wykorzystać istniejące rozwiązanie.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting