Liczba losowa PHP od 1 do 10. Co nowego w PHP7.1: generowanie liczb losowych. Liczby losowe w JavaScript

Już kilka razy pytano mnie, jak robię losowe cytaty na mojej stronie internetowej w bloku „Inteligentne cytaty”. Następnie udało mi się dowiedzieć, że problem polega na tym, że ludzie nie rozumieją, jak wyprowadzić losowy element z tablicy w PHP. Zadanie jest proste, ale mimo to, ponieważ pojawiają się pytania, należy na nie odpowiedzieć.

Zaraz ci podam kod. Załóżmy, że istnieje tablica zawierająca zestaw cudzysłowów. Musisz wybrać jeden losowy z nich i wyświetlić:

Kluczową kwestią jest uzyskanie losowej liczby. Jedyne, co musisz zrobić, to wyznaczyć odpowiednie granice. Jeśli chcesz wybrać losowy element na całej długości tablicy, to jest to liczba od 0 do (długość tablicy minus 1). A następnie po prostu wyciągnij element z tablicy z wynikowym losowym indeksem.

Jeśli chodzi o zadanie z cytatami, lepiej przechowywać je w bazie danych. W zasadzie, jeśli strona jest bardzo prosta, można to zrobić w pliku tekstowym. Ale jeśli w bazie danych, lepiej użyć RAND() i LIMIT w zapytaniu SQL, aby natychmiast otrzymać pojedynczy i losowy cytat z bazy danych.

Aby wygenerować liczbę losową, możesz użyć funkcji PHP Rand() lub mt_rand(). Wymóg stosowania liczb losowych często pojawia się w praktyce przy nazewnictwie zmiennych, plikach, tworzeniu kluczowych informacji i zapewnieniu bezpieczeństwa.

Losowość i niepowtarzalność

Funkcja losowa PHP występuje w dwóch wariantach: Rand() i mt_rand(). Uważa się, że algorytm w pierwszym przypadku jest prostszy i generuje liczby pseudolosowe. Druga opcja ma szybszy algorytm i dobrze znane cechy matematyczne. W większości przypadków, gdy chcesz uzyskać losową liczbę, możesz użyć serii losowych wywołań PHP i uzyskać unikalną kombinację liczb.

Jeśli za podstawę weźmiesz liczby od 1 do 26 lub od 1 do 32 i otrzymasz je losowo, możesz utworzyć kluczowe informacje w postaci sekwencji liter łacińskich lub cyrylicy. W tym przypadku PHP random jest sposobem na wygenerowanie sekwencji informacji alfabetycznych, na przykład na potrzeby testowania kanałów komunikacyjnych lub algorytmów.

Liczba losowa rzadko jest unikalna, ponieważ zgodnie z prawem rozkładu zmiennej losowej może pojawić się wiele razy. Ale jeśli połączysz w szczególności zmienną statyczną PHP i Math.random języka JavaScript, możesz otrzymać naprawdę unikalną liczbę losową, która nie będzie się powtarzać w czasie.

Korzystanie z funkcji czasu

Funkcja czasu, zarówno w PHP, jak i JavaScript, pozwala na tworzenie unikalnych kombinacji liczb, rzadko kiedy w jednym momencie może wystąpić wystarczająco duża liczba zdarzeń i zmienna losowa się powtórzy.

Stosując losowość PHP w zakresie sekund lub milisekund w dużym zakresie możliwych wartości, możliwe jest uzyskanie unikalnych losowych kombinacji cyfr lub liter. Co jeszcze?

Łącząc wartość funkcji czasu, sekwencyjnie rosnącą liczbę i losowość PHP, można zapewnić niezawodne bezpieczeństwo kanałów komunikacyjnych klienta i serwera, tworzyć unikalne kody dla zmiennych i generować nieprzewidywalne zdarzenia w algorytmach.

Generator liczb losowych PHP jest doskonałym rozwiązaniem dla większości zadań, zwłaszcza gdy trzeba szybko uzyskać wysokiej jakości wyniki przy minimalnym wysiłku. Użycie funkcji Rand() i mt_rand w połączeniu z sekwencyjnie rosnącymi ciągami liczb lub wartościami czasu pozwala na uzyskanie liczb losowych, zarówno powtarzających się wartościowo, jak i unikalnych.

Inicjuje generator liczb losowych. Składnia:

Void srand (int nasiono)

Inicjuje generator liczb losowych wartością początkową.

Srand((podwójny) mikrotime()*1000000);
$losowy = rand();
echo $losowe;

GETRANDMAX

Zwraca największą możliwą liczbę losową. Składnia:

Int getrandmax()

Ta funkcja zwraca maksymalną wartość, jaką można uzyskać za pomocą funkcji generowania liczb losowych Rand().

Zwykle jest to 32767

Generuje liczbę losową. Składnia:

Rand całkowity()

Po wywołaniu z opcjonalnymi parametrami min i max funkcja ta generuje losową liczbę do tych parametrów włącznie. Jeżeli brakuje parametrów min i max, zwracana jest liczba z zakresu od 0 do RAND_MAX.

Aby ta funkcja działała poprawnie, przed jej użyciem należy zainicjować generator liczb losowych funkcją srand().

wartość_LCG()

Generator liczb pseudolosowych LCG (PHP 4, PHP 5)

Opis:

Float lcg_value (puste)

lcg_value() zwraca liczbę pseudolosową z zakresu (0, 1). Funkcja łączy dwa generatory z 2^31 - 85 i 2^31 - 249 w okresie.

mt_getrandmax()

Pokazuje największą możliwą wartość losową (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

Int mt_getrandmax (pusta)

Pokazuje maksymalną wartość, jaką może zwrócić funkcja mt_rand()

mt_rand()

Generuje najlepszą losową wartość (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

int mt_rand()

Wiele starszych wersji generatorów liczb losowych ma wątpliwe właściwości i jest powolny. Domyślnie PHP używa funkcji Rand() do generowania liczb losowych. Funkcja mt_rand() jest dobrym zamiennikiem. Wykorzystuje generator liczb losowych, który jest 4 razy szybszy niż Rand() i wykorzystuje Mersenne Twister.

Wywoływana bez opcjonalnych argumentów min i max funkcja mt_rand() zwraca wartość pseudolosową z zakresu od 0 do RAND_MAX. Jeśli chcesz uzyskać np. losowe wartości od 5 do 15 włącznie, poszukaj mt_rand (5, 15).

Przykład użycia mt_rand()

Wynik uruchomienia tego przykładu będzie mniej więcej taki:

1604716014
1478613278
6

Komentarz

Uwaga: W wersjach wcześniejszych niż 3.0.7 drugi parametr funkcji określał zakres liczb. Na przykład, aby w tych wersjach uzyskać liczby losowe od 5 do 15, należy podać funkcję mt_rand(5, 11).

mt_srand()

Ustawia wartość początkową najlepszego generatora liczb losowych (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

Unieważnij mt_srand()

Ustawia wartość początkową generatora liczb losowych za pomocą materiału siewnego. Od wersji PHP 4.2.0 ziarno jest opcjonalne, a domyślne ustawienia wartości losowych są pomijane.

Przykład użycia mt_srand()

Uwaga: Od wersji PHP 4.2.0 nie jest już konieczne inicjowanie generatora liczb losowych za pomocą srand() lub mt_srand(), ponieważ odbywa się to teraz automatycznie.

Technicznie rzecz biorąc, termin „generator liczb losowych” jest bzdurą, ponieważ same liczby nie są losowe. Na przykład, czy 100 jest liczbą losową? A co z 25? Termin ten w rzeczywistości oznacza, że ​​tworzy sekwencję liczb pojawiających się losowo. Rodzi to trudniejsze pytanie: czym jest ciąg liczb losowych? Jedyna poprawna odpowiedź: ciąg liczb losowych to ciąg, w którym wszystkie elementy są niepowiązane. Definicja ta prowadzi do paradoksu, że każda sekwencja może być losowa lub nielosowa, w zależności od sposobu uzyskania sekwencji. Na przykład następujący ciąg liczb
1 2 3 4 5 6 7 8 9 0
uzyskano poprzez wpisanie w odpowiedniej kolejności górnej linii klawiatury, zatem sekwencji nie można uznać za wygenerowaną losowo. A co jeśli uzyskasz tę samą sekwencję po wyjęciu z beczki ponumerowanych piłek tenisowych? W tym przypadku jest to już sekwencja wygenerowana losowo. Przykład ten pokazuje, że losowość sekwencji zależy od sposobu jej uzyskania, a nie od samej sekwencji.

Pamiętaj, że wygenerowany komputerowo ciąg liczb jest deterministyczny: każda liczba z wyjątkiem pierwszej zależy od liczb poprzedzających ją. Z technicznego punktu widzenia oznacza to, że komputer może wygenerować jedynie quasi-losowy ciąg liczb, tj. w rzeczywistości nie są one naprawdę przypadkowe. Jednak w przypadku większości zadań jest to wystarczające i dla uproszczenia takie sekwencje będą nazywane losowymi. Jedną z bardzo interesujących metod opracował John von Neumann; często nazywa się to średnią kwadratową. W tej metodzie poprzednia liczba losowa jest podnoszona do kwadratu, a następnie z wyniku wyodrębniane są środkowe cyfry. Na przykład, jeśli tworzysz liczby trzycyfrowe, a poprzednia liczba wynosiła 121, to podniesienie jej do kwadratu daje wynik 14641. Wyodrębnienie trzech środkowych cyfr daje kolejną losową liczbę 464. Wadą tej metody jest to, że ma bardzo krótki okres powtarzania, zwany cyklem. Z tego powodu metoda ta nie jest dziś stosowana. Nowoczesne metody generowania liczb losowych są znacznie bardziej złożone.

Liczby losowe w PHP

PHP ma dwie grupy funkcji do pracy z liczbami losowymi. Czysto zewnętrznie można je rozróżnić przedrostkiem mt_ dla wszystkich funkcji jednej z grup.

Przestarzałe funkcje
funkcja Randa Zwraca liczbę całkowitą z zakresu od zera do wartości RAND_MAX (która wynosi 32767). Może mieć dwa opcjonalne parametry całkowite - jeśli zostaną określone, od pierwszego parametru do drugiego generowana jest losowa liczba.

Powtórz rand(); echo rand(1100); // Podaj losową liczbę od 1 do 100

Funkcja srand. Określa sekwencję liczb losowych generowanych przez funkcję Rand. Ma cały parametr - dla różnych wartości tego parametru rand będzie generował różne ciągi liczb. Funkcję srand należy wywołać tylko raz przed wszystkimi wywołaniami funkcji rand. Przykład użycia:

Srand (1288); // Zainicjuj generator liczb losowych for($i=0; $query("WYBIERZ LICZBĘ(*) JAKO liczbę Z cudzysłowów");
if ($wiersz = $sth->fetchRow()) (
$liczba = $wiersz;
) w przeciwnym razie (
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("WYBIERZ cytat Z cudzysłowów LIMIT $random,1");
while ($wiersz = $sth->fetchRow()) (
wydrukuj wiersz $.

"\N";
}

Ten fragment kodu określa całkowitą liczbę wierszy w tabeli, generuje losową liczbę z tego zakresu, a następnie używa LIMIT $random,1, aby WYBRAĆ jeden wiersz z tabeli, zaczynając od pozycji $random. W wersji MySQL 3.23 lub wyższej możliwa jest alternatywna opcja:

$sth = $dbh->query("WYBIERZ cytat Z cudzysłowów ORDER BY RAND() LIMIT 1");
while ($wiersz = $sth->fetchRow()) (
wydrukuj wiersz $. "\N";
}

W tym przypadku MySQL najpierw losuje wiersze, a następnie zwraca pierwszy wiersz.