Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowanie liczb z tablicy
Forum PHP.pl > Forum > PHP
znajomy1
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.
thek
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 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ć.
znajomy1
A mógłbyś napisać mi właśnie jak mógłbym sprawdzić czy w danej kolumnie w wierszu powyżej nie ma tej wylosowanej cyfry? Nie wiem właśnie jak mam porównywać te wyniki. Pozdrawiam
thek
Nie dam gotowego kdu jak to zrobić, bo jest to proste. Wskażę Ci podejście smile.gif Masz macierz: x - wiersz, y - kolumna... Skoro sprawdzasz czy w pozycji (x, y) coś może być, to... nie ma tego wśród już wstawionych elementów (to proste... wyrzucasz z tablicy już wstawione elementy) i brak w kolumnie w wierszach powyżej. A czym się kolumna charakteryzuje? Popatrz na indeksy i niezmienność pola y. Zwyczajnie porównujesz tablicę pozostałych elementów i wszystkich pól macierzy już uzupełnionych, o wartości wiersza mniejszych niż obecny, ale z tą samą wartością w kolumnie.
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.