PHP feladatban segítség?
Valaki aki otthon van PHP-ben tudna segíteni egy feladatban?
Szóval létre kell hozni egy tömböt, amiben 20 db 5-35 között, rand() függvénnyel generált szám van, de nem lehet benne 2 ugyanolyan. Hogy lehetne ezt megoldani?
Köszi előre is!
És utána hogy csináljam meg azt, ha nincs köztük ugyanolyan berakja a tömbbe, ha van akkor ne rakja bele?
Ez az első nyelv amit tanulok, szóval eléggé új nekem ez. :/
Bocs. Nem jót írtam, még most iszom a "reggeli" kávémat.
Majd jövök.
Végig kell menni a tömb elemein (komparálni az utoljára generált számot) és ha nincs egyezés, akkor beilleszteni a tömbbe.
Úgy elegáns, ha a tömbindexig komparálsz csak, mert a többi úgy is üres. Vagy dinamikus tömböt használsz, de ilyen csekély elemszámnál nincs jelentősége.
Meg lehet ezt oldani egyszerűen, minden szám kisorsolásnál végignézed a tömböt, hogy szerepel-e benne az adott szám (in_array). Ha nem szerepel, akkor berakod a tömb végére, ha szerepel új számot sorsolsz. Ezt csinálod addig amíg a tömböd 20 eleműre nem duzzad. Ezzel a probléma, hogy attól függően, hogy az itnervallum mekkora részét kell kisorsolni, sokszor ismétlődhet a kód, ha sokszor generálja ki ugyanazokat a számokat.
Az általam preferált, elegánsabb megoldás biztosítja, hogy minden szám kisorsolása csak egy rand() hívást fog eredményezni. A lényege, hog yminden szám kisorsolása után csökkentjük a kisorsolhatószámok intervallumát. Pl
0. lépés: A tömböd üres, sorsolsz egy számot 5 és 35 között, kisorsolod a 15-öt. Berakod a 15-öt a tömbödbe.
1. lépés: Most már csak 6 és 35 között sorsolsz ki számot, tehát az 5-öt már nem tudod kisorsolni. Viszont ha már kihúzott számot sorsolsz ki (15), akkor a szám helyett a más kisorsolt szám indexe + 5 lesz az amit eltárolsz (tehát ha ismét 15-öt sorsolsz ki, akkor a 15 indexe (0) + 5-öt tárolsz le, ami pont az 5, amit kihagytunk az intervallumból.
2. lépés: 7 és 35 között sorsolsz, és ugyanúgy ha már létező számot sorsolsz, akkor a annak az indexét eltolod 5-el, és azt rakod be. Ha az a szám is létezne már, akkor annak az indexét eltolva 5-el, és így tovább, amíg még nem eltárolt számra nem jutsz.
N. lépés: Általánosítva az N. lépésben N+5 és 35 közötti számot sorsolsz ki, és ha a kihúzott szám létezik már a tömbben, akkor veszed annka az indexét, hozzáadsz 5-öt, és megpróbálod újra eltárolni, amíg nem sikerül egy még nem eltárolt számra lépned.
Írtam egy kis függvényt, ami ennek az általánosítását valósítja meg (JavaScriptben, hogy kicsit te is dolgozz azért vele):
function drawRandom(num, min, max)
{
    result = [];
    for(let i = 0; i< num; i++)
    {
        let last = Math.floor(Math.random() * (max-min-i)) + min+i;
        while((ind = result.indexOf(last)) !== -1)
        {
            last = ind + min;
        }
        result[result.length] = last;
       
    }
    return result;
}
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $quantity);
}
<?php
print_r( UniqueRandomNumbersWithinRange(0,25,5) );
?>
20 db 5-35 közötti számra pedig:
<?php
print_r( UniqueRandomNumbersWithinRange(5,35,20) );
?>
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!