Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> losowanie liczb z pewnym warunkiem
acztery
post
Post #1





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


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

Ten post edytował acztery 30.05.2011, 14:07:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
1010
post
Post #2





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

Ostrzeżenie: (0%)
-----


możesz w php losować przedział count z jakiego w danym momencie będziesz losował i dodać go do where.
Go to the top of the page
+Quote Post
aeaeae
post
Post #3





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

Ostrzeżenie: (0%)
-----


  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 ...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 04:49