Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Losowanie liczb z tablicy
znajomy1
post 15.11.2012, 11:14:48
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
thek
post 15.11.2012, 15:47:49
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 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ć.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
znajomy1
post 16.11.2012, 18:52:38
Post #3





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

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


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
Go to the top of the page
+Quote Post
thek
post 16.11.2012, 22:44:18
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 9.05.2025 - 14:44