W świecie rzeczywistym możemy wyróżnić dwa typy liczb losowych:
- Równomierne, gdzie prawdopodobieństwo wylosowania każdej liczby jest takie samo.
- Nierównomierne, gdzie niektóre liczby mają znacznie większe prawdopodobieństwo wylosowania, niż inne.
Okazuje się, że zestawiając dwie równomierne liczby losowe otrzymuje się nierównomierną liczbę losową (dokładnie tak samo jest z dwoma kostkami do gry. Prawdopodobieństwo wyrzucenia 1,1 czy 6,6 jest o wiele mniejsze, niż np. 3,4 albo 5,2). Tę właściwość liczb losowych można doskonale wykorzystać do losowania z tablicy elementów przy wykorzystaniu różnego prawdopodobieństwa trafienia dla różnych pól. Oto przykład ilustrujący to:
<?php
function my_rand(&$dist_values){
$d1 = rand(0, count($dist_values));
$d2 = rand(0, count($dist_values));
$x = $d1 + $d2;
if($x > count($dist_values)){
$x = $d2;
}
if($x == 0){
$x = rand(1, count($dist_values));
}
return $dist_values[ $x ];
}
$dv = array(1 => 'kt', 'dj', 's' , 'm' , 'p' , 'n' , 'g' , 't' , 'th');
$test = array();
for($x = 0; $x < 1000; $x++){
$test[array_search(my_rand($dv), $dv)]++;
}
echo '<ul>';
for($i = 1; $i <= count($test); $i++){
echo '<li>'.$dv[$i].' - '.$test[$i].'</li>';
}
echo '</ul>';
?> |
Przykład wyświetla wyniki losowania 1000 głosek z tablicy $dv. Wyraźnie widać na nich, iż im niższy indeks danego pola w tablicy, tym mniej razy zostało ono wylosowane przez napisaną przez nas funkcję my_rand().
UWAGA: Indeksy pól w tablicach muszą koniecznie zaczynać się od 1, a nie od 0!