Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: losowanie liczb z pewnym warunkiem
Forum PHP.pl > Forum > PHP
acztery
Witam,

Mam pewien problem.

Mam np w bazie 100 rekordów każdy z tych rekordów ma id i np kolumnę count - w której jest liczba
Chcę wylosować 7 rekordów z tej puli 100 z tym ze te o najwyższym count mają wyświetlać się najczęściej.

wiec ORDER by RAND() odpada.

może jakieś pomysły.


Myślałem żeby zapisywać gdzieś ile dany element był losowany i np. jak osiągnie 7 to potem już go nie biorę pod uwagę ale to troszkę bez sensu... może inne rozwiązanie.

EDIT tego typu rzeczy

  1. SELECT * FROM `tag` ORDER BY count DESC,RAND() LIMIT 7


niedziałają. Wiec trzeba to zrobić po stronie PHP
1010
możesz w php losować przedział count z jakiego w danym momencie będziesz losował i dodać go do where.
aeaeae
  1. <?php
  2. define('MAX',100);
  3. define('ILE',7); // ILE<=MAX !!!
  4. for($i=1;$i<=MAX;$i++)
  5. {
  6. $t[$i][0]=$i;
  7. $t[$i][1]=rand(1,10);
  8. }
  9. for($i=1;$i<=ILE;$i++)
  10. {
  11. $u[0]=0;
  12. for($j=1;$j<=MAX+1-$i;$j++)
  13. $u[$j]=$u[$j-1]+$t[$j][1];
  14. $l=rand(1,$u[MAX+1-$i]);
  15. $j=1;
  16. while($l>$u[$j])
  17. $j++;
  18. $r[$i]=$t[$j][0];
  19. for($k=$j;$k<=MAX-$i;$k++)
  20. {
  21. $t[$k][0]=$t[$k+1][0];
  22. $t[$k][1]=$t[$k+1][1];
  23. }
  24. }
  25. for($i=1;$i<=ILE;$i++)
  26. echo $r[$i].'<br />';
  27. ?>


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 ...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.