Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Losowanie liczb z tablicy
znajomy1
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 1.11.2012

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


Potrzebuję losować liczby z przedziału od 1 do wpisanej z formularza. W wierszu już się nie powtarzają, ale mam problem aby zrobić aby w kolumnie też się nie powtarzały. Mój kod wygląda tak.
  1. <?php
  2. $liczba=$_POST['liczba'];
  3.  
  4. echo "<table bgcolor = \"#000000\" cellspacing = \"1\" cellpadding = \"2\">";
  5. for ($y=0; $y<1; $y++) {
  6. //echo $y;
  7. echo "<tr bgcolor = \"white\" align = \"center\">";
  8. for($u=1;$u<=$liczba;$u++)
  9. {
  10. $tab[] = $u;
  11. $wynik = array();
  12. }
  13.  
  14. for($i=0;$i<$liczba;$i++)
  15. {
  16.  
  17. $lntab = count($tab)-1; /*zapisujemy długość tablicy - 1 ponieważ tablica
  18.   jest indeksowana domyślnie od 0, a count liczy od 1*/
  19. $r = mt_rand(0,$lntab); /*zapisujemy losową liczbę*/
  20. $wynik[$y][$i] = $tab[$r]; /*dodajemy do tablicy wynikowej */
  21. $tab[$r] = $tab[$lntab]; /*w wylosowane miejsce przypisujemy
  22.   ostatni element z tablicy*/
  23. //$tab1[]=$lntab;
  24. unset($tab[$lntab]); /*usuwamy ostatni element*/
  25.  
  26. echo "<td width = \"20\" height = \"20\">";
  27. echo $wynik[$y][$i]."</td>";
  28. $d[]=$wynik[$y][$i];
  29. }
  30. echo "</tr>";
  31. $wynik='';
  32. $tab='';
  33. $y=$y+1;
  34. //echo $y;
  35. if($y>=1){
  36. for($u=1;$u<=$liczba;$u++)
  37. {
  38. $tab[] = $u;
  39. $wynik = array();
  40. }
  41. //echo "<pre>";
  42. //print_r($tab);
  43. //echo "</pre>";
  44. for ($s=0; $s<($liczba*$liczba); $s=$s+$liczba) {
  45. $n[]=$d[$s];
  46.  
  47. }
  48. // echo "<pre>";
  49. $g=$n[0];
  50. unset($tab[$g]);
  51. print_r($tab);
  52. //echo "</pre>";
  53. //echo $n[4];
  54.  
  55. }
  56. }
  57.  
  58. echo "</table>";
  59. echo "<pre>";
  60. print_r($d);
  61. echo "</pre>";
  62.  
  63. ?>


Może podpowie ktoś jak to zrobić. Fragment kodu losującego znalazłem na necie (chyba na tym forum) i dobrze się sprawdza.

Ten post edytował znajomy1 15.11.2012, 11:15:12
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
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




A nie prościej byłoby zrobić "od końca"?
1, Wybierasz liczbę.
2. Tworzysz tablicę gotową od 1 do n
3. Mieszasz ją.
4. Wstawiasz jako pierwszy wiersz tablicy.
Kolejne kroki są zależne od implementacji... Ja widze conajmniej 2 pomysły. Jeden bardziej kosztowny obliczeniowo, drugi - pamięciowo.

Pierwszy:
Bierzesz znowu wiersz z danymi i sprawdzasz czy we wszystkich wierszach "powyżej" (z tym samym indeksem kolumny) występuje aktualnie pierwszy w tablicy. Jeśli nie - wkładasz do macierzy i usuwasz go z tablicy oraz przesuwasz się do następnej kolumny. Jeśli jest już "wyżej" to "przekładasz" element na koniec i znów sprawdzasz. Tak do końca wiersza i ostatecznie macierzy (IMG:style_emoticons/default/wink.gif)

Drugi:
Bierzesz i zapisujesz "na boku" co zawiera każda z kolumn (dokładasz element do okreslonej "kolumny" gdy może być włożony na dane miejsce) i porównujesz czy aktualnie pierwszy na liście jest w niej i w razie czego reagujesz odpowiednio

Optymalizacje są możliwe. Przypuśćmy możesz zaoszczędzić pamięć poprzez tworzenie kolumny "w locie", a cykle procka zaoszczędzisz poprzez zamianę przesuwania elementu na koniec na różnicę własnej tablicy możliwych do włożenia z kolumną liczb "powyżej". To ostatnie jest warte rozważenia, gdyż im dalsze wiersze, tym liczba prawdopodobnych "nie trafień" (i tym samym przewijań) bedzie do pewnego momentu się mocno zwiększać.
Go to the top of the page
+Quote Post

Posty w temacie


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: 18.06.2026 - 03:12