Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z losowaniem
Forum PHP.pl > Forum > Przedszkole
n30
Witam
Mam maly problem
Tworze sobie kilka tablic ktorych komorki przyjmuja kolejne wartosci.
w sensie tab1,tab2, tab3 ktore posiadaja indexy od 0 do np 1000.
i wartosc odpowiada indexowi np tab2[666]=666

nastepnie losuje sobie jakas liczbe i ja wybieram z tabeli po czym usuwam index.
I chcialbym tak az do wyczerpania puli.

Moj kod wyglada tak:
  1. <?php
  2. for ($a=0;$a<$iles;$a++) {
  3. $tab1[$a]=$a;
  4. }
  5.  
  6. for ($a=0;$a<$iles;$a++) {
  7. $tab2[$a]=$a;
  8.  
  9. }
  10.  
  11. for ($a=0;$a<$iles;$a++) {
  12. $tab3[$a]=$a;
  13. }
  14.  
  15. for(;;) {
  16. for ($b=1;$b<9;$b++) {
  17. $z="z".$b;
  18. $tablica="tab".$b;
  19.  
  20. $$z=array_rand($$tablica);
  21. unset($$tablica[$$z]);
  22.  
  23. }
  24.  
  25. $tresc=$z1." ".$z2." ".$z3." ".$z4." ".$z5." ".$z6." ".$z7." ".$z8." ";
  26. ?>


Problem polega na tym ze nadal otrzymuje dublujace sie wyniki o dosc duzej powtarzalnosci.

524 1404 1266 1250 536 314 291 1515
1495 1206 375 99 990 1322 651 911
1157 869 1208 353 585 385 780 732
1210 1402 990 590 917 1237 596 409
1001 589 1588 651 1333 524 1404 1266
1250 536 314 291 1515 1495 1206 375
99 990 1322 651 911 1157 869 1208
353 585 385 780 732 1210 1402 990
590 917 1237 596 409 1001 589 1588
651 1333 524 1404 1266 1250 536 314
291 1515 1495 1206 375 99 990 1322
651 911 1157 869 1208 353 585 385
780 732 1210 1402 990 590 917 1237
596 409 1001 589 1588 651 1333 524
1404 1266 1250 536 314 291 1515 1495
1206 375 99 990 1322 651 911 1157
869 1208 353 585 385 780 732 1210
1402 990 590 917 1237 596 409 1001
589 1588 651 1333 524 1404 1266 1250
536 314 291 1515 1495 1206 375 99
990 1322 651 911 1157 869 1208 353
585 385 780 732 1210 1402 990 590
917 1237 596 409 1001 589 1588 651
1333 524 1404 1266 1250 536 314 291
1515 1495 1206 375 99 990 1322 651
911 1157 869 1208 353 585 385 780
732 1210 1402 990 590 917 1237 596
409 1001 589 1588 651 1333 524 1404
1266 1250 536 314 291 1515 1495 1206
375 99 990 1322 651 911 1157 869
1208 353 585 385 780 732 1210 1402
990 590 917 1237 596 409 1001 589
1588 651 1333 524 1404 1266 1250 536
314 291 1515 1495 1206 375 99 990
1322 651 911 1157 869 1208 353 585
385 780 732 1210 1402 990 590 917
1237 596 409 1001 589 1588 651 1333
524 1404 1266 1250 536 314 291 1515
1495 1206 375 99 990 1322 651 911
1157 869 1208 353 585 385 780 732
1210 1402 990 590 917 1237 596 409
1001 589 1588 651 1333 524 1404 1266

ma ktos jakies pomysly?
z gory dziekuje!

Pozdro!
sowiq
Pisane na szybko, więc mogą być błędy. Ale działa.

  1. <?php
  2. $ile = 100; // ilość elementów jednej tablicy
  3.  
  4. $a = Array( Array() ); // dwuwymiarowa tablica
  5.  
  6. for($i = 0; $i <= $ile; ++ $i){
  7. $a[0][$i] = $a[1][$i] = $a[2][$i] = $i; // przypisywanie wartosci
  8. }
  9.  
  10. $elems = $ile * sizeof($a);
  11. while($elems > 0){
  12. $rozmiar = sizeof($a) - 1;
  13.  
  14. while(true){ // losowanie tablicy: $a[0][], $a[1][]...
  15. $r = rand(0, $rozmiar);
  16. if(sizeof($a[rand(0, $r)]) > 0) // jeśli nie wylosowano pustej
  17. break;
  18. }
  19.  
  20. $licznik = 0; // żeby nie kręciło się w nieskończoność
  21. while(++ $licznik < 1000){
  22. $rand = rand(0, $ile); // losowanie elementu
  23. if(isset($a[$r][$rand])){ // jesli nie wylosowano pustego
  24. echo $a[$r][$rand]." "; // drukowanie elementu
  25. unset($a[$r][$rand]); // usuwanie z tablicy
  26. -- $elems;
  27. break;
  28. }
  29. }
  30. }
  31. ?>


[edit]
Oczywiście zamiast
  1. <?php
  2. $licznik = 0; // żeby nie kręciło się w nieskończoność
  3. while(++ $licznik < 1000){
  4. $rand = rand(0, $ile); // losowanie elementu
  5. if(isset($a[$r][$rand])){ // jesli nie wylosowano pustego
  6. echo $a[$r][$rand]." "; // drukowanie elementu
  7. unset($a[$r][$rand]); // usuwanie z tablicy
  8. -- $elems;
  9. break;
  10. }
  11. }
  12. ?>


można zastosować
  1. <?php
  2. $n = array_rand($a[$r]);
  3. echo $a[$r][$n]." ";
  4. unset($a[$r][$n]);
  5. ?>
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.