Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Losowanie bez powtórki
owned
post
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 1
Dołączył: 27.12.2007

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


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.

Ten post edytował owned 2.09.2009, 22:28:59
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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. }


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
owned
post
Post #4





Grupa: Zarejestrowani
Postów: 88
Pomógł: 1
Dołączył: 27.12.2007

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


bez bazy nie da rady ?
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Przecież tu nie ma bazy...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
michal_robak
post
Post #6





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 13.05.2006

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


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

Ten post edytował michal_robak 2.09.2009, 22:39:29


--------------------
do wszystkiego trzeba podejść z głową a problem sam się rozwiąże
Go to the top of the page
+Quote Post
owned
post
Post #7





Grupa: Zarejestrowani
Postów: 88
Pomógł: 1
Dołączył: 27.12.2007

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


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.

Ten post edytował owned 2.09.2009, 22:40:37
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
SzamanGN
post
Post #9





Grupa: Zarejestrowani
Postów: 94
Pomógł: 14
Dołączył: 11.10.2007

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


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);


--------------------
SzamanGN
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 20:10