• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla DO WHILE i problem z warunkiem :/

VPS Starter Arubacloud
0 głosów
269 wizyt
pytanie zadane 31 maja 2017 w PHP przez Amiga4ever Użytkownik (570 p.)
Napisałem prosty kod na zasadzie losowania (coś jak lotto) i nie mogę zmusić do działania warunku połączonego z wielokrotnym "and". Pętla kończy działania jak tylko 1 liczba z 5 jest taka sama zamiast 5 z 5.

 

<?php

$c = rand(1,50);
$w = rand(1,50);
$e = rand(1,50);
$r = rand(1,50);
$t = rand(1,50);

losuj($c,$w,$e,$r,$t);

function losuj($c,$w,$e,$r,$t)
{

$ile=1;

$c1 = rand(1,50);
$w1 = rand(1,50);
$e1 = rand(1,50);
$r1 = rand(1,50);
$t1 = rand(1,50);

do
{
$c1 = rand(1,50);
$w1 = rand(1,50);
$e1 = rand(1,50);
$r1 = rand(1,50);
$t1 = rand(1,50);
$ile++;
}
while(($c!=$c1)&&($w!=$w1)&&($e!=$e1)&&($r!=$r1)&&($t!=$t1));

echo "</br>";
echo $ile;
echo "</br>";
echo "koniec";
echo "</br>";
echo $c."=".$c1;
echo "</br>";
echo $w."=".$w1;
echo "</br>";
echo $e."=".$e1;
echo "</br>";
echo $r."=".$r1;
echo "</br>";
echo $t."=".$t1;
echo "</br>";
}
?>

 

Warunek wydaje sie jak najbardziej poprawny więc czemu nie trybi?

1 odpowiedź

+1 głos
odpowiedź 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Spójrz na warunek w pętli do{}whil(). Brzmi on:
Jeśli c i c1 nie są równe AND w i w1 nie sa równe AND e i e1 nie są równe itd. ...
Jeżeli więc chociaż jedna para będzie będzie się zgadzać dajmy na to w i w1 to:
c i c1 dają true, gdyż sprawdzasz czy się różnią, natomiast w i w1 dają false gdyż sprawdzasz czy się różnią. W tej chwili cały warunek zwróci false gdyż operatory logiczny to AND.
Rozwiązanie jakie powinieneś zastosowac to operator logiczny OR w warunku pętli dzięki czemu tylko w przypadku gdy, żaden z tych warunków się nie spełni pętla nie wykona się ponownie.
Mam nadzieję, że wytłumaczyłem w miarę zrozumiale chociaż jest dosyć późno więc jeśli czegoś nie rozumiesz to śmiało pisz :D
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
edycja 1 czerwca 2017 przez Amiga4ever
No tak teraz załapalem. To inaczej działa niż if gdy stosując operator "and" wszystko na raz musi być spełnione dlatego pomyślałem o tym samym.Tylko teraz zawsze po 3297 próbach znajduje te same liczby. Jak to jest możliwe?
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Hmmmmm szczerze mówiąc nie jestem specem od PHP, ale przy tak dużej ilości jaka jest wykonywana być może jakaś zmienna się przepełnia czy coś w tym stylu trzeba zajrzeć do dokumentacji php, albo poszukać w necie jak znajdę chwile to postaram się odszukać źródło.
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Też o tym myślałem,  że zmienna $i w tym przypadku nie mieści więcej,  ale w php nie da się zadeklarować konkretnej. Ustalana jest automatycznie.
1
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Już rozwiązałem problem. Zrobiłem to na zasadzie tablic i wreszcie działa. Trafienie 5 liczb z puli 50 w grze euromilion wynosi jak 1 do 2 milionów. :)

<?php

$lotto1 = array();

for($i=1;$i<51;$i++)
{
array_push($lotto1, $i);
}

shuffle($lotto1);

$c = $lotto1[0];
$w = $lotto1[1];
$e = $lotto1[2];
$r = $lotto1[3];
$t = $lotto1[4];

losuj($c,$w,$e,$r,$t);

function losuj($c,$w,$e,$r,$t)
{

$lotto = array();

array_push($lotto, $c);
array_push($lotto, $w);
array_push($lotto, $e);
array_push($lotto, $r);
array_push($lotto, $t);

$ile=1;

$lotto2 = array();

for($a=1;$a<51;$a++)
{
array_push($lotto2, $a);
}

shuffle($lotto2);

$c1 = $lotto2[0];
$w1 = $lotto2[1];
$e1 = $lotto2[2];
$r1 = $lotto2[3];
$t1 = $lotto2[4];

do
{
shuffle($lotto2);
$c1 = $lotto2[0];
$w1 = $lotto2[1];
$e1 = $lotto2[2];
$r1 = $lotto2[3];
$t1 = $lotto2[4];
$ile++;
}

while ((!in_array($c1, $lotto))||(!in_array($w1, $lotto))||(!in_array($e1, $lotto))||(!in_array($r1, $lotto))||(!in_array($t1, $lotto)));

echo "</br>";
echo $ile;
echo "</br>";
echo "koniec";
echo "</br>";
echo $c."=".$c1;
echo "</br>";
echo $w."=".$w1;
echo "</br>";
echo $e."=".$e1;
echo "</br>";
echo $r."=".$r1;
echo "</br>";
echo $t."=".$t1;
echo "</br>";
}
?>
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Brawo Ty :D!
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Jeszcze raz dzięki za pomoc z warunkiem.
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Nie ma sprawy, po to jest forum :D

Podobne pytania

+1 głos
1 odpowiedź 176 wizyt
pytanie zadane 22 stycznia 2022 w PHP przez kubekszklany Gaduła (3,230 p.)
0 głosów
1 odpowiedź 811 wizyt
+1 głos
2 odpowiedzi 395 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Igor4567 Nowicjusz (170 p.)

93,025 zapytań

141,990 odpowiedzi

321,292 komentarzy

62,371 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...