[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
Prześlij komentarz
Dzięki za komentarz!