Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] losowanie - tablica wielowymiarowa
Forum PHP.pl > Forum > Przedszkole
Dj.Crack
Witam,

mam problem z losowaniem liczb, które są umieszczone w tablicy.

  1. <?php
  2. $list= array(
  3. "a" => range(1, 7),
  4. "b" => range(1, 7),
  5. "c" => range(1, 7),
  6. );
  7. ?>


Chciałbym móc wylosować 5 liczb - z tym, że losowanie między tablicy "a", "b", "c" może się powtarzać, ale wylosowane
liczby w tych tablicach już nie.

Na przykład wylosowałem: 1, 2, 3, 4, 7
z tablicy "a" liczby: 1, 3, 7
z tablicy "c" liczby: 2, 4

ale może być również: 1, 1, 1, 4, 6
z tablicy "a" liczby: 1, 6
z tablicy "b" liczby: 1
z tablicy "c" liczby: 1, 4

Próbowałem na rózne sposoby array_rand(), ale niestety efekty nie były zadowalające.
Prosiłbym o jakieś wskazówki, jak zabrać się za to losowanie.

Pozdrawiam
ber32
Jeszcze raz array_rand()
to działa
sprawdzałem

Daj jakiś kod jak sprawdzałeś
Dj.Crack
Cytat(ber32 @ 9.03.2013, 15:36:25 ) *
Jeszcze raz array_rand()
to działa
sprawdzałem

Daj jakiś kod jak sprawdzałeś



  1. $a = array_rand($list, 1);
  2. $tmp['random'] = array_rand($list[$a], 5);


powyższy kod losuje 5 liczb - jednak tylko albo z tabeli "a", albo z "b", albo z "c".
Mi zalezy jednak na tym, żeby losował ze wszystkich (z tym, że dana liczba z danej tabeli nie powtarza się).
ber32
Napisałem gotowca jak o toki kod chodzi.

  1. $list= array(
  2. "a" => range(1, 7),
  3. "b" => range(1, 7),
  4. "c" => range(1, 7),
  5. );
  6.  
  7. $tmp = array_rand($list['a'], 5);
  8. $tmp1 = array_rand($list['b'], 5);
  9. $tmp2 = array_rand($list['c'], 5);
  10. echo $list['a'][$tmp[1]];
  11. echo $list['b'][$tmp1[1]];
  12. echo $list['b'][$tmp1[2]];
  13. echo $list['c'][$tmp2[1]];
  14. echo $list['c'][$tmp2[2]];
  15.  


Dj.Crack
hmm, ale tutaj z automatu narzucasz, że z pierwszej tablicy będzie jedna liczba
z drugiej tablicy dwie liczby i z trzeciej tablicy równiej dwie liczby. Tak więc w żadnym wypadku
nie można mówić tutaj o pełnej losowości...
ber32
możesz jeszcze do tego użyć shuffle();

to moia propozycja, a ty zrób co chcesz

zapomniałem możesz jeszcze powiedzieć co to jest pełna losowość ?
Dj.Crack
Cytat(ber32 @ 9.03.2013, 17:08:47 ) *
możesz jeszcze do tego użyć shuffle();

to moia propozycja, a ty zrób co chcesz


Dziękuję za pomoc, ale niestety to nie rozwiązuje problemu.


Cytat(ber32 @ 9.03.2013, 17:08:47 ) *
zapomniałem możesz jeszcze powiedzieć co to jest pełna losowość ?


to skrót myślowy odnoszący cię do pierwszego postu - czyli w jaki sposób mają być losowane liczby.
ber32
ok oneeyedsmiley02.png
_Borys_
  1. <?php
  2.  
  3. $list = array(
  4. "a" => range(1, 7),
  5. "b" => range(1, 7),
  6. "c" => range(1, 7),
  7. );
  8. $tmp = array_rand($array_tmp = array_merge_recursive($list['a'], $list['b'], $list['c']),5);
  9. foreach ($tmp as $key => $key_array_tmp)
  10. {
  11. echo $array_tmp[$key_array_tmp] . '<br />';
  12. }
Dj.Crack
Dziękuję za pomoc, array_merge_recursive rozwiązuje problem smile.gif
Michael2318
Można też użyć np. czegoś takiego:

  1. function rand_unique_numbers($count, $from, $to, $array = true)
  2. {
  3. $count = intval($count);
  4. $from = intval($from);
  5. $to = intval($to);
  6.  
  7. if ( $count < 1 || $to < 1 || $from > $to || $count > $to || $to > 10000 )
  8. {
  9. return FALSE;
  10. }
  11.  
  12. $tab = array();
  13. for($i=$from; $i<=$to; $i++)
  14. {
  15. $tab[] .= $i;
  16. }
  17.  
  18. shuffle($tab);
  19.  
  20. $loosed = $array ? array() : '';
  21. for($i = $from; $i<($count+$from); $i++)
  22. {
  23. if ( $array )
  24. {
  25. $loosed[] .= $tab[$i];
  26. }
  27. else
  28. {
  29. $loosed .= $tab[$i].', ';
  30. }
  31. }
  32. if ( !$array )
  33. {
  34. $loosed = rtrim(trim($loosed), ',');
  35. }
  36.  
  37. return $loosed;
  38. }


W tym momencie do zmiennej/tablicy przypisujesz sobie po prostu tą funkcję, np.:
  1. $zmienna = rand_unique_numbers(5, 0, 100, true);

gdzie w powyższym przykładzie wylosowane zostanie 5 liczb z przedziału 0 - 100, bez powtarzania się. Wynikiem funkcji będzie tablica, natomiast jeśli jako ostatni parametr podasz false, zwrócony zostanie string - liczby po przecinku.

wink.gif
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.