[PHP] Losowa liczba

W tym wpisie przerobimy losowanie liczb w PHP. Losową liczbę można wygenerować na kilka sposobów. Najprostszym z nich jest skorzystanie z oferowanych przez PHP i przeznaczonych właśnie do tego celu funkcji. Należy jednak mieć na uwadze, że liczby wygenerowane przez te lub inne funkcje nie będą losowe, a pseudolosowe. Dlaczego? Nie można mówić o losowości, kiedy to algorytm generuje liczby.

mt_rand

Pierwszą i jedną z lepszych metod, których możemy użyć do wygenerowania liczb losowych jest funkcja mt_rand. Jest to lepsza wersja funkcji rand, o której w dalszej części artykułu.

Przykładowe użycie funkcji

  • echo mt_rand();
  • echo mt_rand(5, 10);

Funkcja mt_rand może przyjąć dwa opcjonalne argumenty (int)min i (int)max. Jest to przedział, z którego losowane mają być liczby. Np. mt_rand(1, 5) zwróci pseudolosową liczbę nie mniejszą niż 1 i nie większą niż 5. Domyślną wartością argumentu min jest 0, a argumentu max wartość zwracana przez funkcję mt_getrandmax.

rand

Funkcja rand generuje liczbę stałoprzecinkową i podobnie jak jej lepsza wersja może przyjąć dwa opcjonalne argumenty min i max o takich samych wartościach domyślnych co mt_rand.

Przykładowe użycie funkcji rand

  • echo rand();
  • echo rand(10, 20);

Powyższe funkcje nieznacznie różnią się szybkością.

Algorytm Xorshift

W tym przykładzie stworzymy funkcję generującą pseudolosowe liczby przy użyciu algorytmu Xorshift:

<?php

function generate_numbers($amount, $min, $max) {

    $numbers = [];

    $x = time();

    for($i = 0; $i < $amount; $i++) {
    
        $x ^= ($x << 13);
        $x ^= ($x >> 17);
        $x ^= ($x << 5);
        
        $number = $min + ($x & ($max - $min));
        $numbers[] = $number;
        
    }

    return (int)implode('', $numbers) ;
    
}

echo generate_numbers(10, 1, 100);

W powyższej funkcji użyto zmiennej $x jako ziarna generatora. W pętli for wykonuje się operacje XOR na zmiennej $x z przesunięciem bitowym w lewo i prawo. Następnie wynik jest dodawany do tablicy $numbers, którą następnie łączymy i zwracamy jako ciąg liczb. Argumenty (int)$min i (int)$max to zakres z jakiego mają być losowane liczby.

Komentarze

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?