IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP-pozice určitého čísla

Aktivity
Avatar

Člen
Avatar
:2.4.2020 19:56

čau, mám takový problém, chci na náhodný generátor čísel vytvořit i to na které pozici se nachází nejvyšší číslo, což se mi i objevuje.

$count= $_POST["a"];
$random= array(null);
$max = $random[0];


if($count<=20 and $count>0)
{
echo "čísla jsou:";

for ($i = 0; $i < $count; $i++){
            $random = mt_rand(0,50);
            echo " $random , ";
            if($random>$max)
          {$max=$random;}
            else
            {continue;}
          for($i1=1;$max=$random;$i++)
          {echo "";}
      }
      echo "<br><br>největší číslo je:" . " $max<br>";
      echo "<br>pozice čísla je: ";
    }
    else
    {echo "chyba v zadání";}
   ?>

Zkusil jsem: zkoušel jsem již přes array_search a přes podmínku if a for, ale ani jedno mi nefungovalo proto bych prosil o pomoc

Chci docílit: snažím se dosáhnout efektivního udání pozice nejvyššího čísla např. číslo se nachází na pozici X(1,2,3,...)

Editováno 2.4.2020 19:57
 
Odpovědět
2.4.2020 19:56
Avatar
Neaktivní uživatel:3.4.2020 7:13

Ahoj, nejsem si z tvého zadání vším jistý, ale tady máš dvě řešení:

Pokud výstupem nemají být unikátní čísla

$min = 0;
$max = 15;
$total = 20; // $total = $_POST["a"];
$numbers = [];

for ($i = 1; $i <= $total; $i++) {
    array_push($numbers, mt_rand($min, $max));
}

echo 'čísla jsou: ' . join(', ', $numbers) . '<br/>';
echo 'nejvyšší hodnota je: ' . max($numbers) . '<br/>';
echo 'pozice nejvyšší hodnoty je/jsou: '. join(', ', array_map(function ($i) { return $i + 1; }, array_keys($numbers, max($numbers))));

Pokud výstupem mají být pouze unikátní čísla

$min = 0;
$max = 15;
$total = 20; // $total = $_POST["a"];
$total = count(range($min, $max)) < $total ? count(range($min, $max)) : $total;
$numbers = [];

while(($i = count($numbers)) < $total) {
    array_push($numbers, mt_rand($min, $max));
    $numbers = array_unique($numbers);
}

echo 'čísla jsou: ' . join(', ', $numbers) . '<br/>';
echo 'nejvyšší hodnota je: ' . max($numbers) . '<br/>';
echo 'pozice nejvyšší hodnoty je: ' . (array_keys($numbers, max($numbers))[0] + 1);
Nahoru Odpovědět
3.4.2020 7:13
Neaktivní uživatelský účet
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.4.2020 9:49
//{$max=$random;}
{$max=$random; $pozice=$i;}
 
Nahoru Odpovědět
3.4.2020 9:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.4.2020 9:55

Jinak, v tom kodu mas spousty nesmyslu. Ono to nejspis funguje, ale nespolehal bych na to. Treba mi neni jasne, proc random definujes nejdriv jako array, a pak to zmenis na value (float/string)

$random= array(null); // ???
$max = $random[0];
$random = mt_rand(0,50); //???
// s array se preci pracuje takto
$pole[] = cislo;
$pole[$i] = cislo;

...

 
Nahoru Odpovědět
3.4.2020 9:55
Avatar
Odpovídá na Peter Mlich
Neaktivní uživatel:3.4.2020 10:12

To není pravda, protože $i ve for cyklu počítá od nuly, takže pozice by byla reálně o jednu vyšší než by mu ukázala tvá úprava.

Ušlo by to v nouzi jako pozice v poli, jenže pole si hned při prvním průchodu přepíše na int. Nemluvě o dalších problémech v kódu a o tom, že takto postvený random generátor může s určitou pravděpodobností vygenerovat stejné nejvyšší číslo opakovaně a ty bys mu řekl jen první výskyt.

Nahoru Odpovědět
3.4.2020 10:12
Neaktivní uživatelský účet
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Neaktivní uživatel
Peter Mlich:3.4.2020 14:43

Zadne pole neuklada, na nulte pozici je null a tu pozici prepisuje.

Jeste bych mozna zminil

 for($i1=1;$max=$random;$i++)
// $i1 a $i++ ??? urcite vis, co delas?
// $max=$random ??? porovnani je >= <= a ==, rovnitko je prirazeni
(bool) $max=$random // true, takze cyklus ihned skonci, ne?
 
Nahoru Odpovědět
3.4.2020 14:43
Avatar
Odpovídá na Peter Mlich
Neaktivní uživatel:3.4.2020 15:31

Kdybych v té větě přímo nedodával, že si pole při prvním průchodu přepíše na int. Navíc nepřepisuje žádnou nultou pozici. On přepíše celý typ proměnné $random.

Ale o pole nejde. Jde o to, že ve for cyklu počítaném od nuly je rada $pozice=$i bez dalších úprav špatně, protože $i je v tom kódu o jednu menší než reálně vypsaná pozice největšího čísla.

Když to podle tvé první rady rozchodí, dostane na výstupu tohle

45, 41, 49, 36, 13, 4, 37, 16, 48, 32, 20, 38, 38, 20, 27
největší číslo je: 49
pozice čísla je: 2

Nahoru Odpovědět
3.4.2020 15:31
Neaktivní uživatelský účet
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.4.2020 17:59

A tento problem uz si dokaze vyresit sam... Mne to totiz prijde jako ukol do skoly a nehodlam to cele resit za nej.

 
Nahoru Odpovědět
3.4.2020 17:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.