Avatar billede hkb-x Nybegynder
07. august 2007 - 16:32 Der er 7 kommentarer og
1 løsning

kontroleret tilfældig fordeling

Jeg vil gerne kunne vælge tilfældigt mellem en række ID numre men samtidigt skal der være størrer chancer for noget istedet for noget andet...

Jeg bruger følgende kode:

$værdi = x;

for($c=0;$c<$værdi;$c++) {

    $output[] = $id;

}

$id = $output[@array_rand($output)];


$id er et givet ID jeg vil have
$værdi angiver hvor vigtigt ID'et er

her gentager jeg ID'et det antal gange jeg som $værdi angiver og derve får jeg det rigtige forhold mellem ID'erne men det kan godt være ret tungt for serveren så kan man gøre nogenlunde det samme bare uden at belaste serveren nær så meget?
Avatar billede mcardle Nybegynder
08. august 2007 - 21:52 #1
Jeg ved ikke helt, hvordan du vil sørge for at id'erne ligger i slutningen af array'et, men det her script har større sandsynlighed for at vælge den større halvdel af array'et, end den mindre. Håber du forstår.:

<?php

$db_array = array("18276","937293","728378","732838");

for($i=0;$i<count($db_array);$i++){
    $rand[] = $i;
}
for($j=(count($db_array)/2);$j<count($db_array);$j++){
    $rand[] = $j;
}

shuffle($rand);
$curOutput = $db_array[current($rand)];

echo $curOutput;

?>

//mcardle
Avatar billede hkb-x Nybegynder
15. august 2007 - 15:57 #2
nice... men kan den gøres endnu mere ekstrem?

den er fin hvis man kan har 5 - 6 værdier men har man lidt over 100 kan man næsten ikke mærke nogen forskel på den og så en almindelig rand()...
Avatar billede mcardle Nybegynder
15. august 2007 - 20:45 #3
Hvor mange vil du gerne have der skal være større sandsynlighed for at "ramme"?

Hvad er det helt præcis du gerne vil lave?

//mcardle
Avatar billede hkb-x Nybegynder
16. august 2007 - 10:25 #4
Jeg vil gerne have at forskellen gennem arrayet bliver større... så der er meget stører sandsynlighed for at ramme de sidste end de første... Har man et stort array bliver det nærmest udvasket så man ikke kan mærke nogle bliver vægtet højere end andre...
Avatar billede mcardle Nybegynder
16. august 2007 - 12:17 #5
Det virker som du gerne vil have det nu. Du kan altid sætte flere på.

<?php

//Create array
for($i=0;$i<60;$i++){
    $db_array[] = round(((($i + 52) / 4) * 3));
}

for($a=0;$a<count($db_array);$a++){
    $rand[] = $a;
}
if($db_array > 1){
    for($b=(count($db_array)/2);$b<count($db_array);$b++){
        $rand[] = $b;
    }
   
    if($db_array > 10){
        for($c=(count($db_array)/3);$c<count($db_array);$c++){
              $rand[] = $c;
        }
       
        if($db_array > 50){
            for($d=(count($db_array)/4);$d<count($db_array);$d++){
                  $rand[] = $d;
            }
        }
    }
}

shuffle($rand);
$curOutput = $db_array[current($rand)];

echo $curOutput;

?>

$db_array skal bare være dit mysql-udtræk.

//mcardle
Avatar billede mcardle Nybegynder
16. august 2007 - 12:34 #6
Du skal også lige sætte en round(); udenom $a, $b, $c og $d.

//mcardle
Avatar billede hkb-x Nybegynder
01. oktober 2007 - 12:08 #7
ok.... skriv svar for point...
Avatar billede mcardle Nybegynder
01. oktober 2007 - 14:33 #8
Svar...

//mcardle
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