Avatar billede sqwer Nybegynder
03. september 2001 - 21:04 Der er 27 kommentarer og
4 løsninger

Tilfældig rækkefølge

Jeg skal have tallene fra 1-8 sat i tilfældig rækkefølge.
Hvad er den smarte måde at gøre det på? (Den usmarte må være at lave en lille tabel med kun de 8 poster og bruge ORDER BY rand())
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:06 #1
$tal = rand(1,8)

::sunlock.dk::
Avatar billede faehunden Nybegynder
03. september 2001 - 21:06 #2
$tal = rand(1, 8);
Avatar billede faehunden Nybegynder
03. september 2001 - 21:07 #3
Nå, lidt for langsom :-)
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:07 #4
Ehehe.... manglede ;

$tal = rand(1,8);

Sorry...

::sunlock.dk::
Avatar billede faehunden Nybegynder
03. september 2001 - 21:08 #5
Bemærk lige at med denne metod vil den ret ofte vælge samme tal en del gange efter hinanden... Så du er klar over det :-)
Avatar billede sqwer Nybegynder
03. september 2001 - 21:12 #6
\"samme tal en del gange efter hinanden...\"
vil det sige at jeg får et tilfældigt tal mellem 1 og 8 8 gange?
Jeg skal have hvert af de 8 tal én gang.
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:14 #7
Du får ET tal mellem 1 og 8, EN gang.
Men der er jo den sandsynlighed for at fx 3 udkommer 2 eller flere gange efter hinanden.

::sunlock.dk::
Avatar billede jelzin101 Praktikant
03. september 2001 - 21:20 #8
så skal du lave et array med 8 elementer og fylde det op i en lykke med den af sunlock beskrevede metode medens du for hvert gennemløb enten foretager en vurdering om tallet er valgt før - eller trækker det valgte tal fra\"puljen\".
Avatar billede faehunden Nybegynder
03. september 2001 - 21:20 #9
Ja, og den sandsynlighed er ret stor :-) Specielt når der er så få tal at vælge imellem, men det er det jo altid, også hvis du tager 8 lapper papir og trækker en tilfældig en, så er sandsynligheden for at du trækker den samme 2 gange efter hindanden ret meget større end hvis der var 10000000 lapper papir ;-) Men det er nok den bedste måde at gøre dette på.
Avatar billede sqwer Nybegynder
03. september 2001 - 21:20 #10
Det var det jeg prøvede at antyde med den \"usmarte\" metode.
Altså man tager 8 nummererede bolde, smider dem ned i en pose, og rører rundt hvorefter man tager en op ad gangen uden tilbagelægning.
Kan det gøres relativt enkelt?
Avatar billede sqwer Nybegynder
03. september 2001 - 21:22 #11
Og jeg kan vel komme til at vente længe før jeg har alle 8. Vil det være totalt blæst at lave en lillebitte tabel bare til at tage dem fra?
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:23 #12
Den tabel vil fylde så lidt, at det er lige meget. MEN det tager tid og resurser at oprette forbindelse til en db, så hellere bruge rand(1,8);

::sunlock.dk::
Avatar billede faehunden Nybegynder
03. september 2001 - 21:25 #13
Hvis det er en stor side med mange besøgende er det blæst, da du så altid skal mindste databasens arbejde/størrelse mest muligt, men ellers er den jo fin nok (ideen altså). Ellers kan du gøre som jelzin101 foreslog
Avatar billede sqwer Nybegynder
03. september 2001 - 21:27 #14
Jeg har allerede fat i databasen tidligere i samme fil, så vil det gøre en forskel med et ekstra kald?
Avatar billede faehunden Nybegynder
03. september 2001 - 21:28 #15
Tvivler meget :-)
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:28 #16
Så bør du lave det kald samtidig, fordi det er totalt hul i hovedet at oprette et ekstra kald bare for et tal, som du kan få med rand();

::sunlock.dk::
Avatar billede sqwer Nybegynder
03. september 2001 - 21:32 #17
sunlock>> det er ikke for et tal, men for otte tal :-)!
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 21:35 #18
Jamen så brug rand() og se om den værdi, du får ud allerede er taget ud... eller gør som jelzin101 siger, med et array. Så kan du fjerne den værdi der bliver taget ud :9

::sunlock.dk::
Avatar billede faehunden Nybegynder
03. september 2001 - 21:35 #19
Uanset hvad... Hvis du vil have det UDEN tilbagelægning (så du aldrig får det samme tal 2 gange, så bliver du nødt til at lave en form for løkke hvor alle de tal som er blevet udtrukket bliver gemt i en variabel for sig selv, og hver gang et tal bliver udtrukket skal du tjekke om det er identisk med en af de andre variabler... Det er besværligt men højest sandsynligt den eneste måde at gøre det på :-(
Avatar billede sqwer Nybegynder
03. september 2001 - 21:51 #20
For 15 point ekstra er der så en af jer der gider skrive sådan en løkke for mig?
(Mit php-kendskab kan ligge på et meget lille sted, så det ville tage mig længere tid end jeg bryder mig om at tænke på :)
Avatar billede fireworld Nybegynder
03. september 2001 - 21:57 #21
Du kan f.eks lave sådan her


<?
$old=\"\";
srand((double)microtime()*1000000);
while(!$done){
$new = rand(1,8);
if(!ereg($new,$old)){$old=\"$old$new\";}
if(strlen($old)==8){$done=true;}
}
?>


det er ikke testet .. men vil tror det kan laves sådan :)

Avatar billede fireworld Nybegynder
03. september 2001 - 21:58 #22
og så selvføgelig til slut en

print\"$old\";
Avatar billede sqwer Nybegynder
03. september 2001 - 22:05 #23
hvordan får jeg dem så ud igen, et ad gangen?
Avatar billede repsac Nybegynder
03. september 2001 - 22:07 #24
<?php
while($ok !== \"ok\") {
    $array = array();
    $rand = rand(1,8);
    if (!in_array($rand, $array)) {
        $array[] = $rand;
        $ok = \"ok\";
    }
}
echo $rand;
?>
*Utestet!
Avatar billede repsac Nybegynder
03. september 2001 - 22:10 #25
Nej nej ... det går jo aldrig! - jeg burde gå i seng i stedet ... :)
Avatar billede fireworld Nybegynder
03. september 2001 - 22:18 #26
hmmmm altså

hvis nu det eksempel jeg har lavet

<?
$old=\"\";
srand((double)microtime()*1000000);
while(!$done){
$new = rand(1,8);
if(!ereg($new,$old)){$old=\"$old$new\";}
if(strlen($old)==8){$done=true;}
}
?>


giver

$old til at blive

$old=12345678;

så laver du sådan her


<?
while($done<=strlen($old)){
$done++;
$tmp=substr($old,$done,1);
print\"$tmp<br>\";
}
?>
Avatar billede fireworld Nybegynder
03. september 2001 - 22:19 #27
altså

<?
$old=\"\";
srand((double)microtime()*1000000);
while(!$done){
$new = rand(1,8);
if(!ereg($new,$old)){$old=\"$old$new\";}
if(strlen($old)==8){$done=true;}
}
while($done<=strlen($old)){
$done++;
$tmp=substr($old,$done,1);
print\"$tmp<br>\";
}
?>
Avatar billede sqwer Nybegynder
03. september 2001 - 22:30 #28
takker.
med tilføjelse af $done=-1; mellem løkkerne kører det.
Avatar billede sunlock.dk Nybegynder
03. september 2001 - 22:32 #29
Takker for points ;)

::sunlock.dk::
Avatar billede jelzin101 Praktikant
03. september 2001 - 22:33 #30
takker.
Avatar billede fireworld Nybegynder
03. september 2001 - 22:40 #31
lol ikke fordi jeg er en points freak... MEEEEEN var det ikke at stramme den ikke at give mig ngoen points?
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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