Avatar billede Plexi Nybegynder
05. september 2011 - 17:29 Der er 7 kommentarer og
1 løsning

PHP - Generér 200 tilfældige, men unikke numre.

Hej Eksperter.

Jeg har for sjov siddet og rodet med at få genereret 200 tilfældige numre, men jeg kan ikke få dem til at være unikke - altså 200 forskellige numre!

Jeg har lavet følgende kode:
$Total = 0;
$NumberOld = 0;
While ($Total != 200) {
    $Random = mt_rand(60,300);
    $NumberNew = $Random." ";
    If ($NumberNew != $NumberOld) {
        file_put_contents("number.txt", $NumberNew, FILE_APPEND);
        file_put_contents("total.txt", $Total);
        $Total++;
    }
    $NumberOld = $NumberNew;
}

som ganske vist genererer 200 numre, men de er ikke unikke - hvad gør jeg forkert?

Jeg har prøvet en masse forskelligt. Deriblandt at ændre:
$NumberNew = $Random." "; til
$NumberNew = "100";
og så laver scriptet ganske rigtigt kun ét tal, men kommer så til gengæld med en timeout fejl, fordi, den jo ikke kan generere 200 tal.
Jeg har også prøvet forskellige placeringer af
$NumberOld = $NumberNew;
linjen, men heller ikke dette hjalp.

Jeg går ud fra, at kontrollen af om $NumberNew og $NumberOld ikke er lig hinanden fejler fordi $NumberOld ikke bliver ført med rundt i hele loopet?

Håber ikke, jeg har forvirret Jer nu - jeg prøver bare at komme med så meget info som muligt. ;o)

100 point gives! Ikke fordi spørgsmålet er så vigtigt - bare for at opildne Jer til at svare. :)
Avatar billede erikjacobsen Ekspert
05. september 2011 - 18:19 #1
Jeg vil foreslå dig at putte alle tal fra 60 til 300 ind i et array, og så tilfældigt fjerne et tal (ud fra et tilfældigt index) fra arrayet til der er 200 tal tilbage.
Avatar billede arne_v Ekspert
05. september 2011 - 19:06 #2
3 forskellige maader:

function unique_ran_shuffle($count, $min, $max) {
    $all = range($min, $max);
    shuffle($all);
    return array_slice($all, 0, $count);
}

function unique_ran_test($count, $min, $max) {
    $num = array();
    for($i = 0; $i < $count; $i++) {
        do {
            $val = rand($min, $max);
        } while(array_search($val, $num));
        $num[] = $val;
    }
    return $num;
}

function unique_ran_testsmart($count, $min, $max) {
    $num = array();
    $numchk = array();
    for($i = 0; $i < $count; $i++) {
        do {
            $val = rand($min, $max);
        } while(array_key_exists($val, $numchk));
        $numchk[$val] = true;
        $num[] = $val;
    }
    return $num;
}
Avatar billede Plexi Nybegynder
06. september 2011 - 16:50 #3
@ Arne:
Tak for din kommentar.

Alle 3 metoder gør det samme, eller?
Jeg må indrømme, at jeg har lidt svært ved et gennemskue, hvad de gør, samt hvordan jeg skal implementere dem i min eksisterende kode.
Jeg skal bruge alle tallene samlet i en tekstfil, hvorfor jeg havde lavet det i min kode. :)
Avatar billede arne_v Ekspert
06. september 2011 - 17:03 #4
De goer det samme paa forskellig maade.

Funktionerne returnerer et array med $count unikke tal mellem $mon og $max.

Du kan saa goere hvad du vil med det array inkl. skrive det til fil.
Avatar billede arne_v Ekspert
14. oktober 2011 - 23:59 #5
Tid at faa afsluttet her?
Avatar billede Plexi Nybegynder
15. oktober 2011 - 00:43 #6
Tjah, du må da gerne få pointene, så vi kan lukke tråden, men jeg er ikke kommet videre i sagen.
Jeg har ikke kunne gennemskue dine koder og heller ikke kunne gennemskue, hvordan jeg skulle bruge Array'et til noget - derudover skulle jeg ikke bruge det til noget vildt seriøst, så da jeg fandt ud af, hvor bøvlet det var for mig, så droppede jeg det! :)

Men hvis du kan uddybe nærmere, hvordan jeg kan bruge Array'et, så er du da velkommen.
Men lav et svar (i stedet for en kommentar), så får du pointene prompte! :-)
Avatar billede arne_v Ekspert
15. oktober 2011 - 04:12 #7
<?php
function unique_ran_shuffle($count, $min, $max) {
    $all = range($min, $max);
    shuffle($all);
    return array_slice($all, 0, $count);
}

foreach(unique_ran_shuffle(100, 1, 200) as $n) {
    file_put_contents("C:\\work\\number.txt", "$n\r\n", FILE_APPEND);
}
?>
Avatar billede arne_v Ekspert
15. oktober 2011 - 04:12 #8
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester