Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowanie bez powtórki
Forum PHP.pl > Forum > Przedszkole
owned
Witam!
Napisałem skrypt który losowo ładuje pliki .php:

  1. $los_tab = Array('onas','oferta','kontakt');
  2. $los_tab_a = count($los_tab);
  3. $random_amount = (count($los_tab))-1;
  4. $los_b = rand(0,$random_amount);
  5.  
  6. function wybierz_losowo($atrybut) {
  7. global $random_amount;
  8. global $los;
  9.  
  10. do {
  11. $los=rand(0,$random_amount);
  12. } while ($los==$atrybut);
  13. return $los;
  14. };
  15.  
  16. switch ($id) {
  17.  
  18. case 'onas':
  19. wybierz_losowo(0);
  20. include('include/'.$los_tab[$los].'_mini.php');
  21. break;
  22.  
  23. case 'oferta':
  24. wybierz_losowo(1);
  25. include('include/'.$los_tab[$los].'_mini.php');
  26. break;
  27.  
  28. case 'kontakt':
  29. wybierz_losowo(2);
  30. include('include/'.$los_tab[$los].'_mini.php');
  31. break;
  32.  
  33. default:
  34. if($id=='' || $id=='home'){
  35. wybierz_losowo(2);
  36. include('include/'.$los_tab[$los].'_mini.php');
  37. }else {
  38. include('include/'.$los_tab[$los_b].'_mini.php');
  39. };
  40. break;
  41.  
  42. }


funkcja 'wybierz losowo' wybierze losowo element z tablicy $los_tab oprocz $los_tab[$atrybut]

Wszystko elegancko działa. Problem polega na tym, że niekiedy randomizer losuję kilka razy z rzędu ten sam element tablicy. Prosiłbym o pomoc w udoskonaleniu tego skryptu tak aby za każdym razem wylosował inny element.
thek
Przecież random ma być randomowy i takie sytuacje jak opisujesz mają prawo się zdarzać. Każde inne losowe już nie jest, a mam wrażenie, że chodzi Ci o to by po wylosowaniu elementu nie wylosował go już do momentu, aż wszystkie inne nie zostaną choć raz. Wtedy robisz dodatkową tablicę lub wpis w bazie, że pozycja została już wylosowana ustawiasz jej flagę. Losujesz zaś z pozostałych. W momencie gdy wszystkie mają już flagę ustawioną kasujesz flagi i zaczynasz zabawę od nowa.
erix
Zastosuj coś w tym stylu:
  1. $rands = array();
  2.  
  3. for($a=0;$a<10;$a++){
  4. $x = 0;
  5. do{
  6. $x = mt_rand();
  7. while(in_array($x, $rands));
  8. $rands[] = $x;
  9. }
owned
bez bazy nie da rady ?
erix
Przecież tu nie ma bazy...
michal_robak
skoro masz tu tylko los od 0 do 3 to za wiele nie poszalejesz smile.gif. A random na takim duzym zakresie bedzie Ci sie baaaardzo często powatrzał chyba ze zrobisz tablicę ... $wylosowane i w momencie wylosowania liczby dodajesz ją do tej tablicy. Potem juz przy drugim losowaniu sprawdzasz czy wylosowana liczba znajduje się w tej tabeli (funkcja in_array dla podpowiedzi) i jeżeli jej tam nie ma to wychodzisz z pętli. Gdybys miał duuuuzy zakres to sprawa prostsza. Tworzysz sobie tablice powiezmy od 0 do 100 z takimi samymi wartościami co indeksy bądź z wartością 1 oznaczająca niewylosowaną wartość (do wyboru do koloru). Teraz losujesz liczbe 33 to albo zdejmujesz indeks 33 popem albo ustawiasz wartosc $tablica[33]=0 co oznacza ze wylosowana i losujemy raz jeszcze. Chwila skupienia i rozwiązanie samo przychodzi do głowy. Pozdrawiam i owocnej pracy

EDIT - ops ktoś mnie wyprzedził smile.gif
owned
Cytat(erix @ 2.09.2009, 23:30:19 ) *
Zastosuj coś w tym stylu:
[PHP] pobierz, plaintext
  1. $rands = array();
  2. for($a=0;$a<10;$a++){
  3. $x = 0;
  4. do{
  5. $x = mt_rand();
  6. while(in_array($x, $rands));
  7. $rands[] = $x;
  8. }
[PHP] pobierz, plaintext


No sposób ciekawy, jutro bede sie z tym bawił i dam znać. Zastanawialem się jeszcze nad usuwaniem z tablicy wylosowanych juz elementów

Cytat(erix @ 2.09.2009, 23:35:47 ) *
Przecież tu nie ma bazy...


To było do theka biggrin.gif wciąłeś się

ok dzięki wielkie.
thek
Cytat(owned @ 2.09.2009, 23:41:03 ) *
To było do theka biggrin.gif wciąłeś się

Więc przeczytaj dokładnie smile.gif Napisałem, że wpisujesz te dane do tablicy lub bazy smile.gif nie wiedziałem bowiem czy dane o plikach przechowujesz w postaci jakiegoś systemu bazodanowego czy też może to jakiś prostszy skrypt oparty jedyne o same katalogi. Stąd zaproponowałem rozwiązanie jako jedno z dwojga smile.gif To które byśużył byłoby zależne od implementacji. No i oczywiście gdzieś całą tablicę musiałbyś zapamiętywać. Ja osobiście, by nie motać za bardzo wylosowany element tablicy danych bym usuwał. Gdy tablica by się opróżniła to budowałbym nową. A całość bym wrzucił gdzieś do zapamiętywania... Choćby cookie smile.gif
SzamanGN
Można zrobić to tak:
  1. $testowaTablica=array("Wpis_1","Wpis_2","Wpis_3");
  2. function pokaz_losowy_element($tablica)
  3. {
  4. shuffle($tablica);
  5. return $tablica[0];
  6. }
  7. echo 'Pobrany losowy wpis z tablicy: '.pokaz_losowy_element($testowaTablica);
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.