Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] losowanie - tablica wielowymiarowa
Dj.Crack
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.07.2004

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


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

Ten post edytował Dj.Crack 9.03.2013, 14:37:46
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
ber32
post
Post #2





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


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

Daj jakiś kod jak sprawdzałeś

Ten post edytował ber32 9.03.2013, 15:38:59
Go to the top of the page
+Quote Post
Dj.Crack
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.07.2004

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


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ę).

Ten post edytował Dj.Crack 9.03.2013, 16:06:25
Go to the top of the page
+Quote Post
ber32
post
Post #4





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


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.  


Go to the top of the page
+Quote Post
Dj.Crack
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.07.2004

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


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





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


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ść ?

Ten post edytował ber32 9.03.2013, 17:10:40
Go to the top of the page
+Quote Post
Dj.Crack
post
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.07.2004

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


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





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


ok (IMG:style_emoticons/default/oneeyedsmiley02.png)
Go to the top of the page
+Quote Post
_Borys_
post
Post #9





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

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


  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. }
Go to the top of the page
+Quote Post
Dj.Crack
post
Post #10





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.07.2004

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


Dziękuję za pomoc, array_merge_recursive rozwiązuje problem (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Michael2318
post
Post #11





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


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.

(IMG:style_emoticons/default/wink.gif)

Ten post edytował Michael2318 9.03.2013, 21:09:21
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: 23.08.2025 - 12:57