<?php
define('ILE',7
); // ILE<=MAX !!! {
$t[$i][0]=$i;
}
for($i=1;$i<=ILE;$i++)
{
$u[0]=0;
for($j=1;$j<=MAX+1
-$i;$j++) $u[$j]=$u[$j-1]+$t[$j][1];
$j=1;
while($l>$u[$j])
$j++;
$r[$i]=$t[$j][0];
for($k=$j;$k<=MAX-$i;$k++)
{
$t[$k][0]=$t[$k+1][0];
$t[$k][1]=$t[$k+1][1];
}
}
for($i=1;$i<=ILE;$i++)
?>
Jeśli masz dwa rekordy, z których chcesz losować pierwszy z prawdopodobieństwem 1/3 a drugi 2/3 to dajesz rand(1,3) i dla wylosowanej 1 wybierasz pierwszy rekord a dla 2 i 3 wybierasz drugi. Tak samo działa powyższy skrypt. Przypisałem dla 100 rekordów liczby od 1 do 10. Rekord, który ma wartość 4 będzie dwa razy częściej losowany od tego, który ma 2 itd., oczywiście zależność prawdopodobieństwa od wartości możesz sobie matematycznie zmienić ...
Wytłumaczę dla czterech rekordów. Np.
pierwszy rekord=4,
drugi=7,
trzeci=2,
czwarty=1
Zasada jest taka, że sumuję wszystkie wartości rekordów i losuję liczbę od 1 do tej sumy (czyli 14). Tworzę tablicę sum częściowych ($u)
$u[1]=4
$u[2]=11
$u[3]=13
$u[4]=14
i sprawdzam pomiędzy którymi wartościami sum leży wylosowana liczba (dzięki $j). Następnie przypisuję jej indeks do wyniku (tablica $r) i wyrzucam ją z tablicy $t żeby zrobić następne losowanie ...