Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Skrypt totka
Forum PHP.pl > Forum > Przedszkole
Glarden
Witom Was, napisałem sobie taki skrypcior toto-lotka:
  1. Wpisz 6 liczb i wylosuj<br>
  2. <form action='lotek.php' method='post'>
  3. Liczby:<br> 
  4. <input type='text' name='jeden' style='width: 20px;'/>
  5. <input type='text' name='dwa' style='width: 20px;'/>
  6. <input type='text' name='trzy' style='width: 20px;'/>
  7. <input type='text' name='cztery' style='width: 20px;'/>
  8. <input type='text' name='piec' style='width: 20px;'/>
  9. <input type='text' name='szesc' style='width: 20px;'/>
  10. <br><input type='submit' value='Losuj!'/>
  11. </form>
  12. <hr>
  13. <?php
  14. if (isset ($_POST['jeden']) && ($_POST['dwa']) && ($_POST['trzy']) && ($_POST['cztery']) && ($_POST['piec']) && ($_POST['szesc'])) {
  15. $n = 0;
  16. $t = 0;
  17. $tra = 0;
  18. $wybrane = array();
  19. array_push($wybrane, $_POST['jeden']);
  20. array_push($wybrane, $_POST['dwa']);
  21. array_push($wybrane, $_POST['trzy']);
  22. array_push($wybrane, $_POST['cztery']);
  23. array_push($wybrane, $_POST['piec']);
  24. array_push($wybrane, $_POST['szesc']);
  25. $wylosowane = array();
  26. echo ("Wylosowane liczby to: ");
  27. while ($n<5) {
  28. $losuj = rand(1,48);
  29. $dodaj = array_push($wylosowane, $losuj);
  30. echo ($losuj." ");
  31. $n++;
  32. }
  33. foreach ($wybrane as $wyb) {
  34. if (in_array ($wyb, $wylosowane)) {
  35. $tra++;
  36. }
  37. }
  38. echo ("<br>Trafiles $tra liczb!");
  39. switch ($tra) {
  40. case 0 : echo (" Nie trafiles nic! Ale cieniastwo!"); break;
  41. case 1 : echo (" Phi! Jedna liczbe to kazdy potrafi trafic."); break;
  42. case 2 : echo (" Eee tam, tylko 2. Nic nie wygrales, po co sie bylo meczyc?"); break;
  43. case 3 : echo (" Calkiem niezle. Ale to i tak mala wygrana."); break;
  44. case 4 : echo (" Ha! Czworka! To juz jest cos..."); break;
  45. case 5 : echo (" Lo ludzie, ale niezle, trafiles piatke!"); break;
  46. case 6 : echo (" Aaale jaja! Trafiles 6! Kurde, ale farciarz!"); break;
  47. }
  48. }
  49. ?>

No i wszystko działa cacy, poza jedną rzeczą: zdarza się czasem, że wylosowane liczby się powtarzają. Macie jakiś pomysł jak zrobić, żeby były "unikalne"?
piotrekkr
  1. <?php
  2. while ($n<5) {
  3. $losuj = rand(1,48);
  4. if(!in_array($losuj, $wylosowane)){
  5. $dodaj = array_push($wylosowane, $losuj);
  6. echo ($losuj." ");
  7. $n++;
  8. }
  9. }
  10. ?>
Glarden
Niestety, nie działa. Jeśli wylosuje jakąś liczbę, która już jest w tablicy to po prostu przerywa skrypt...
piotrekkr
Tzn w jaki sposób przerywa skrypt?? Bo nie za bardzo rozumiem jest jakiś komunikat czy coś questionmark.gif
Glarden
Przestaje losować i wyświetla napis w zależności od tego, ile liczb się trafiło. Np. jeśli pierwsza wylosowana liczba to 1 i czwarta to też 1 - przestaje losować, wyświetla tylko 3 liczby i napis.
Darti
  1. <?php
  2. while (count($wylosowane)<6) {
  3. $losuj = rand(1,48);
  4. if(!in_array($losuj, $wylosowane)){
  5. $dodaj = array_push($wylosowane, $losuj);
  6. }
  7. echo ($losuj." ");
  8. }
  9. ?>
Glarden
No i to też nie działa. Przed chwilą wylosował mi dwie 35 pod rząd.
piotrekkr
  1. <?php
  2. while (count($wylosowane) < 6) {
  3. $losuj = rand(1,48);
  4. if(!in_array($losuj, $wylosowane)){
  5. $dodaj = array_push($wylosowane, $losuj);
  6. echo ($losuj." ");
  7. $n++;
  8. }
  9. }
  10. ?>

to dziala przynajmniej mi
Cysiaczek
Dzieje się tak dlatego, ze że totolotek to w praktyce stos, z którego losuje się jedną cyfrę i ją usuwa ze stosu, a potem losuje się nastepną. Porponuję zatem przyjrzeć się funkcji http://www.php.net/manual/pl/function.array-rand.php
Jest rozwiązaniem zadania.

  1. <?php
  2. $stos=range(1, 49);
  3. $wynik=array_rand($stos, 6);
  4. ?>


Pozdrawiam.

--edit
Nie wiem, czy na pewno array-rand usuwa wylodswoane elementy, jesli nie, to m,usisz to zrobic ręcznie
  1. <?php
  2. $stos=range(1, 49);
  3. $i=0;
  4.  while($i < 6)
  5.  {
  6. $wynik[$i]=array_rand($stos);
  7. unset($stos[array_search($wynik[$i], $stos)]);
  8. $i++;
  9.  }
  10. ?>
piotrekkr
tak sie przyjrzałem jeszcze pierwszemu rozwiązaniu które napisałem i ono też dobre bylo tylko licznik trzeba bylo ustawić na $n < 6 wtedy n jest 0,1....5 po czym pętla sie kończy bo nie spełniony jest warunek czyli losuje 6 liczb...
Glarden
Zrobiłem tak:
  1. <?php
  2. while (count($wylosowane)<6) {
  3. $losuj = rand(1,48);
  4. if (!in_array($losuj, $wylosowane)) {
  5. $dodaj = array_push($wylosowane, $losuj);
  6. echo ($losuj." ");
  7. $n++;
  8. }
  9. else {
  10. $n = $n;
  11. }
  12. ?>

Wydaje mi się, że działa, chociaż trudno to sprawdzić bo to w końcu liczny losowe... Ale jak na razie nie wylosował dwóch takich samych. A trafiłem piątkę.smile.gif
piotrekkr
wywal to bo to nic nie robi
  1. <?php
  2. $n = $n;
  3. ?>
działa bez tego bo sprawdzałem smile.gif
Darti
Cytat(Glarden @ 13.06.2007, 14:48:07 ) *
A trafiłem piątkę.smile.gif


To wypłać sobie 3812.70 zł smile.gif

p.s. a co to jest ? :
  1. <?php
  2. else {
  3. $n = $n;
  4. }
  5. ?>
Glarden
Właśnie tak sobie myślałem, czy to aby nie jest niepotrzebne. Zaraz wywalę.
No cóż, trochę trudno mi będzie wypłacić sobie aż tyle... a szkoda...smile.gif
Cysiaczek
@Glarden - Twoja funckja jest BŁĘDNA. Działa tak jakby:

Maszyna losująca losuje kulkę powiedzmy z numerkiem 5. Sprawdza, czy w kolekcji wylosowanych liczb znajduje się 5. Jeśli nie mam jej tam, to zostaje zanotowana jako wylosowana, ale maszyna losująca dalej może wylosować liczbę 5, bo nie usunąłeś jej z komory losującej. W ten sposób w teorii losowanie może się nigdy nie zakończyć, bo maszyna ciągle może wypluwać 5.
uff

Użyj mojego skryptu - działa na 100% poprawnie.

Pozdrawiam.
piotrekkr
Cytat(Cysiaczek @ 13.06.2007, 16:53:34 ) *
@Glarden - Twoja funckja jest BŁĘDNA. Działa tak jakby:

Maszyna losująca losuje kulkę powiedzmy z numerkiem 5. Sprawdza, czy w kolekcji wylosowanych liczb znajduje się 5. Jeśli nie mam jej tam, to zostaje zanotowana jako wylosowana, ale maszyna losująca dalej może wylosować liczbę 5, bo nie usunąłeś jej z komory losującej. W ten sposób w teorii losowanie może się nigdy nie zakończyć, bo maszyna ciągle może wypluwać 5.
uff

Użyj mojego skryptu - działa na 100% poprawnie.

Pozdrawiam.

Wiadomo ze twój jest lepszy smile.gif Ale tamten tez działa chociaż nie jest taki szybki i dobry jak twój. A prawdopodobieństwo wylosowania za każdym razem tej samej liczby jest równe prawie zeru...
Cysiaczek
OMG. Tu nie chodzi o to, który jest wydajniejszy, tylko o to, że jego jest makabrycznie błędny, bo:
1. Może się zapętlić
2. Jest niezgodny z zasadami totolotka.
W totolotku maszyna nie ma możliwości wylosowania tej samej liczby - losuje na zbiorze pomniejszonym o wylosowaną kulkę. W ten sposób (jaki ~Glarden zrobił) zaburzony zostaje rachunek prawdopodobieństwa.

Pozdrawiam.
Glarden
Dokładnie, cysiaczku. Mój działa, bo praktycznie niemożliwe jest losowanie ciągle 5. Ale dobra, dobra, jak mi się będzie chciało, to użyję Twojej.
piotrekkr
Cytat(Cysiaczek @ 13.06.2007, 17:05:17 ) *
OMG. Tu nie chodzi o to, który jest wydajniejszy, tylko o to, że jego jest makabrycznie błędny, bo:
1. Może się zapętlić
2. Jest niezgodny z zasadami totolotka.
W totolotku maszyna nie ma możliwości wylosowania tej samej liczby - losuje na zbiorze pomniejszonym o wylosowaną kulkę. W ten sposób (jaki ~Glarden zrobił) zaburzony zostaje rachunek prawdopodobieństwa.

Pozdrawiam.

Tępy nie jestem wiem ze to nie jest zgodne z rachunkiem prawdopodobieństwa ale 6 roznych liczb losuje a on chciał żeby poprawić jego skrypt żeby losował unikalne liczby. To poprawiłem smile.gif a to juz jego sprawa jakim sposobem on zrobił resztę skryptu bo w sumie nie pytał o metodę wykonania zadania...
Cysiaczek
Ehh : | Znalezłem błąd w swojej funckji, ale poszukajcie sami - podpowiem, że źle usuwa zmienne.

: >
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.