Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Modyfikacja skryptu losowania liczb
yorgwarez
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.04.2010

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


Witam wszystkich forumowiczów,
Jestem początkującym programistą php i stawiam dopiero pierwsze kroki. Obecnie zajmuję się generatorem liczb losowych bez powtarzania.

Mam stworzone oto coś takiego:

  1. <?php
  2. // Tworzymy tablice ze zdefiniowanymi liczbami do wylosowania
  3. $cfg['list'] = array_flip(range(1, 12));
  4.  
  5. // Losowanie
  6. $tmp['random'] = array_rand($cfg['list'], 2); // Drugi parametr odpowiada za ilość elementów, które mają zostać wylosowane
  7. // Sortowanie
  8. sort($tmp['random']);
  9. // Throw
  10. echo implode(', ', $tmp['random']);
  11. ?>


Zastanawiam się teraz i już 3 dzień nie mogę znaleźć rozwiązania, co zrobić, aby skrypt mógł np. wypisać pary liczb ze wszystkich elementów tej tablicy jaka jest tworzona i wyrzucił je na ekranie w sposób, że w każdej linijce znajduje się para liczb: LICZBA 1 - LICZBA 2 i w następnych linijkach poniżej kolejne pary liczb, oczywiście bez powtarzania i tak by powstały pary ze wszystkich elementów tworzonej tablicy. Czy trzeba jakąś pętlę wrzucić do skryptu? Ktoś mógłby mi pomóc i pokazać na przykładzie? Z góry dziękuję za pomoc:) Pozdrawiam Wszystkich Forumowiczów (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
sada
post
Post #2





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


zależy co rozumiesz przez powtarzanie:

np.
- czy tepary są dla ciebie identyczne $[1],$[2] i $[2],$[1] ?
- czy ma nie być powtórzeń w wylosowanych parach $[1],$[1] $[5],$[5] ?
Go to the top of the page
+Quote Post
peter13135
post
Post #3





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


Nie wiem, czy wiem o co Ci chodzi.... więc wybacz, jeśli dam Ci bezużyteczny kod.
  1. $tablica = array(1,2,3,4,5,6,7,8,9,10);
  2. for($i=0;$i<=10;$i+=2)//zamiast tej "sztywnej" dyszki, możesz tutaj dać zmienną wyplutą przez count($tablica)
  3. {
  4. echo $tablica[$i] . ' ' . $tablica[$i+1] . '<br />' ;
  5. }


Ten post edytował peter13135 27.08.2011, 09:33:16
Go to the top of the page
+Quote Post
sada
post
Post #4





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


@peter13135
$i<9 bo zabraknie towaru (IMG:style_emoticons/default/biggrin.gif)
bo ostatni element tablicy ma index 9

Ten post edytował sada 27.08.2011, 09:48:28
Go to the top of the page
+Quote Post
yorgwarez
post
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.04.2010

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


Dziękuje wszystkim za pomoc:)
Peter13135 o coś takiego mi chodziło, tylko z małą modyfikacją. Wypisuje pary liczb z zakresu tablicy ale jak zrobić by te liczby ustawiane w pary były pomieszane a nie zawsze po kolei? Chodzi mi np. o wylosowanie par z zakresu tablicy typu 3-1, 8-2 itp. Oczywiście bez powtarzania się liczb tak jak teraz.
Go to the top of the page
+Quote Post
sada
post
Post #6





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


  1. $tablica = array(1,2,3,4,5,6,7,8,9,10);
  2.  
  3. for($i=0;$i<10;$i++){
  4. for($k=$i+1;$k<10;$k++){
  5. echo $tablica[$i] . '-' . $tablica[$k] . '<br />' ;
  6. }
  7. }


żeby pomieszać dodaj shuffle($tablica) i umieść po definicji tablicy

Ten post edytował sada 27.08.2011, 10:24:23
Go to the top of the page
+Quote Post
peter13135
post
Post #7





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


Cytat(sada @ 27.08.2011, 10:40:09 ) *
@peter13135
$i<9 bo zabraknie towaru (IMG:style_emoticons/default/biggrin.gif)
bo ostatni element tablicy ma index 9


Racja (IMG:style_emoticons/default/wink.gif)


W takim razie pomieszaj tę tablicę, i dopiero potem puść do pętli. Zobacz jak działa ten skrypt:
  1. <?
  2. $a = range(1,20);
  3. shuffle($a);
  4. print_r($a);
  5. ?>
Go to the top of the page
+Quote Post
yorgwarez
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.04.2010

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


sada o coś takiego jak napisałeś właśnie mi chodziło:) Tylko pojawia się taka kwestia że skrypt wypisuje chyba wszystkie możliwości par jakie mogą być z elementów tablicy.. A mi chodziło o efekt żeby powstały pary z elementów tablicy jednakże bez powtarzania, po prostu każdej liczbie przypisywana by była inna liczba jaka do tej pory nie wystąpiła i tak tworzyłyby się pary... Chyba trzeba by dodać jakiś warunek/ograniczenie?

peter13135 wyrzuca mi elementy w skrypcie Twoim w brzydki sposób tj. przez array jako tablicę po prostu pokazuje..

Ten post edytował yorgwarez 27.08.2011, 10:47:48
Go to the top of the page
+Quote Post
peter13135
post
Post #9





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


Cytat(yorgwarez @ 27.08.2011, 11:47:06 ) *
peter13135 wyrzuca mi elementy w skrypcie Twoim w brzydki sposób tj. przez array jako tablicę po prostu pokazuje..


ehh. JA NIE DAŁEM CI W TYM PRZYPADKU GOTOWCA.
Napisałem Ci skrypt który tworzy tablicę typu array(1,2,3,4...,20), następnie ją miesza i wyświetla, żebyś mógł zobaczyć na własne oczy rezultat działania skryptu. Na podstawie tego skryptu i pętli, którą Ci dałem w swoim wcześniejszym poście powinieneś potrafić samodzielnie napisać skrypt, który wypisze te pary liczb.

@sada, mogłeś się powstrzymać, trochę trzeba motywować do samodzielnego myślenia.

Ten post edytował peter13135 27.08.2011, 12:46:56
Go to the top of the page
+Quote Post
sada
post
Post #10





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


w takim razie bliżej petera13135
  1. $tablica = array(1,2,3,4,5,6,7,8,9,10);
  2. shuffle ($tablica);
  3. for($i=0;$i<count($tablica);$i=$i+2){
  4. echo $tablica[$i] . '-' . $tablica[$i+1] . '<br />' ;
  5. }
Go to the top of the page
+Quote Post
Dominator
post
Post #11





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Mam skrypt który generuje liczby o określonej godzinie i w określone dni. Oczywiście bez powtarzania ich.

  1. <html>
  2. <title>Generator szczesliwego numerka</title>
  3. <body>
  4. <?php
  5. $dzien=date('D');
  6. $biezaca_godzina=date('H');
  7. $godzina_losowania="17";
  8.  
  9. if($dzien=="Sat" || $dzien=="Sun") {
  10. echo 'W dzisiejszym dniu nie sa losowane szczesliwe numerki';
  11. exit; }
  12.  
  13. else {
  14. if(file_exists('numerek/numerek.txt')) {
  15. $liczby=file('numerek/numerek.txt');
  16. if ($liczby[2]==$dzien && $biezaca_godzina>=$godzina_losowania) {
  17. echo 'Dzisiejsze szczesliwe numerki to: ';
  18. echo intval($liczby[0]).', '.intval($liczby[1]); }}
  19.  
  20. if($liczby[2]!=$dzien && $biezaca_godzina>=$godzina_losowania) {
  21. $liczba1=rand(1,30);
  22. $liczba2=rand(1,30);
  23. while($liczba2==$liczba1) {
  24. $liczba2=rand(1,30); }
  25. $plik=fopen('numerek/numerek.txt', 'w');
  26. fwrite($plik, "$liczba1 - Pierwsza liczba
  27. $liczba2 - Druga liczba
  28. $dzien");
  29. fclose($plik);
  30. echo 'Dzisiejsze szczesliwe numerki to: ';
  31. echo $liczba1.', '.$liczba2; }}
  32. if($liczby[2]!=$dzien && $biezaca_godzina<$godzina_losowania) {
  33. echo 'Na dzisiejszy dzien nie zostaly jeszcze rozlosowane szczesliwe numerki<br>';
  34. echo 'Losowanie szczesliwych numerkow rozpocznie sie dzis o '.$godzina_losowania.':00'; }
  35. ?>
  36. </body>
  37. </html>
Go to the top of the page
+Quote Post
yorgwarez
post
Post #12





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.04.2010

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


peter13135, no okej, skrypt działa i potrafię wypisać te elementy w inny sformatowany sposób, ale jak mam połączyć liczby w cyfry na podstawie tego co mi napisałeś? Tak jak napisał sada kod, to skrypt działa poprawnie tylko wypisuje wszystkie możliwe kombinacje par liczbowych, jak mogę je ograniczyć? Czytałem trochę o sposobach ograniczeń powtarzania się liczb w skryptach losujących ale albo radzą pracować na sesjach i cookies albo w sumie nikt nie znalazł uniwersalnego rozwiązania... Bo chcialem po prostu zmodyfikować rozwiązanie które napisał sada stosując ograniczenie by wypisywało tylko wszystkie możliwe pary raz z danego zakresu a nie wszystkie mozliwe kombinacje.. Żeby utworzyło pary z liczb danego zakresu tablicy wykorzystując wszystkie elementy tablicy losowo i jednokrotnie w przypadkowej kolejności bez powtarzania. Czyli do tego skryptu od sada muszę napisać pętlę by ograniczyć działanie tworzenia par tylko do jednorazowego wyczerpania wszystkich elementów z tablicy?

Przepraszam Was wszystkich za te moje pytania i dziękuję Wam z góry za cierpliwość mi okazaną i pomoc jaką do tej pory od Was otrzymałem. Dominator, patrzę na Twój skrypt i jak ograniczyłeś/wykluczyłeś powtórzenia? Jakieś sugestie jak najłatwiej to można zrobić?
Go to the top of the page
+Quote Post
peter13135
post
Post #13





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


aby mieć wyniki na stałe, wylosuj raz, przypisz do sesji i będziesz miał na stałe. ewentualnie, jeśli ma to wynik losowania ma być taki sam dla wszystkich odwiedzających, to zserializuj tablicę i zapisz do pliku (funkcje serialize i file_put_contents). Do odczytywania tablicy użyj unserialize i file_get_contents.
Oczywiscie musisz zrobić odpowiednie warunki, jeśli nie ma wolosowanego, to losuj, jeśli jest, to nmie losuj, tlko wczytaj z pliku, czy sesji.

Nie wiem co to znaczy połączyć liczby w cyfry

W jaki sposób chcesz ograniczać skrypt sady ? co chcesz osiągnąć ?
Go to the top of the page
+Quote Post
yorgwarez
post
Post #14





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.04.2010

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


Skrypt sady wypisuje wszystkie możliwe kombinacje par liczbowych utworzonych z zakresu tablicy zdefiniowanego na początku (ilość elementów w tablicy). Ja chciałbym wprowadzić ograniczenie, aby wypisywane były pary powstałe w wyniku losowania i mieszczące się w zakresie elementów tablicy, ale nie wszystkie możliwości, ale tak by każda liczba miała przypisaną inną liczbę (tworząc parę), mieszcząc się w zakresie tablicy bez powtórzeń.

Może na przykładzie będzie prościej - załóżmy że to będzie aplikacja losująca pary piłkarskie w pucharach piłki nożnej. Każda cyfra z tablicy to jedna drużyna. Załóżmy że mamy 8 cyfr w tablicy do wylosowania. Do wylosowania są 4 pary liczb. Ale nie wypisujemy wszystkich możliwych kombinacji par liczbowych, ale chcemy przeprowadzić losowanie i utworzyć 4 losowe pary liczbowe bez powtórzeń. I za każdym uruchomieniem skryptu uczynić to od nowa, czyli losowanie się powtarza ale tworzone są nowe pary wg warunków podanych powyżej.

Jak zmodyfikować skrypt sady, jakie ograniczenie wprowadzić, by wypisywało tylko raz te pary liczbowe a nie wszystkie możliwe kombinacje?
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: 5.04.2026 - 03:54