Avatar billede n-emy Nybegynder
13. november 2005 - 18:06 Der er 7 kommentarer og
2 løsninger

% dels chance for noget sker?

Hey,


En der kan hjælpe med et script der giver en % dels chance for at noget sker?

F.eks. et script der siger at der er
70 % chance for at der kommer til at stå "Hej" og 30% chance for der kommer til at stå "hej2"?
Avatar billede bromer Nybegynder
13. november 2005 - 18:10 #1
<?php
function wrand($selector) {
        $selected = rand(0,array_sum($selector));

        $sf = 0;
        foreach($selector as $return => $length) {
                if ($sf <= $selected && (($sf+$length) > $selected))
                        return $return;

                $sf += $length;
        }
}
?>

Så kan du bare angive lave dit array med $selector = array('hej' => 70, 'hej2' => 30);
Avatar billede nielle Nybegynder
13. november 2005 - 18:11 #2
Jeg er ikke helt sikker på at jeg har forstået spørgsmålet korrekt, men er der ikke bare rand() du skal have fat i:

http://dk2.php.net/rand

F.eks. i form af denne lille stumpå kode:


if (rand(1, 100) <= 70)
    echo "Hej";
else
    echo "Hej2";
Avatar billede bromer Nybegynder
13. november 2005 - 18:13 #3
nielle: Jeg tror du har forstået det helt korrekt :) Vi har lavet det samme, bortset fra at den stump kode jeg skrev kan tage en masse forskellige muligheder.
Avatar billede nielle Nybegynder
13. november 2005 - 18:30 #4
bromer> Din kode er fin, bortset fra at rand() skal går fra 1 til 100. Hvis den går fra 0, er der nemlig 101 mulige udfald, og så bliver sandsynlighedsfordelingen en lille smule forkert. :^)
Avatar billede steven_ Nybegynder
13. november 2005 - 19:24 #5
Jeg forstår det som om det er noget alá nedenstående der efterspørges?

$txt = array("hej1", "hej2", "hej3", "hej4", "hej5");

for ($i=0; $i<count($txt); $i++)
{
    echo 100/count($txt) . "% for at " . $txt[$i] . " vil blive vist!" . "<br />";
}
Avatar billede n-emy Nybegynder
14. november 2005 - 18:00 #6
Kunne kun forstå nielle's kode:)

Tak:)

svar?
Avatar billede nielle Nybegynder
14. november 2005 - 19:19 #7
Hvis jeg nu forklare bromer's kode, vil du så gå med til at vi deler pointes på denne?

Jeg synes nemlig at den - trods nogle små skønhedsfejl - er rimeligt snedig. Og så har den den fordel at den kan trække lod mellem mere end kun 2 mulige udfald. :^)

Her er koden i en lettere omskreven form:

<?php
function wrand($muligeUdfald)
{
    $skaebnen = rand(1, 100);

    $chanceSum = 0;
    foreach ($muligeUdfald as $udfald => $chance)
    {
        if ($chanceSum<$skaebnen && $skaebnen<=$chanceSum+$chance)
            return $udfald;

        $chanceSum += $chance;
    }
}

$muligeUdfald = array("hej1" => 20, "hej2" => 35, "hej3" => 45);
echo wrand($muligeUdfald);
?>

1) For det første er der arrayet med %-chancerne. I eksemplet her skal der være 20% chance for at der bliver skrevet "hej1", 35% for "hej2" og endlig 45% for "hej3".

2) Funktionen wrand() starter med at generere et tilfældigt heltal fra 1 til 100. Lad os som et eksempel antage at det var $skaebnen=49. Nu skal vi så bare finde ud af om dette svare til hej1, ...2 eller ...3.

3a) Det er så det som foreach-løkken gør; Den starter med $chanceSum=0, $udfald="hej1" og $chance=20. If-sætningen ser altså sådan her ud:

    if (0<49 && 49<=0+20)

Dette er selvfølgeligt ikke opfyldt, og derfor går foreach-løkken videre. Læg imidlertid mærke til at der jo er 20% chance for at et tilfældigt tal, $skaebnen, imellem 1 og 100 netop opfylder at:

    if (0<$skaebnen && $skaebnen<=0+20)

3b) I andet gennemløb er $chanceSum=20, og derfor ser if-sætningen nu sådan her ud:

    if (20<$skaebnen && $skaebnen<=20+35)

- og dette passer fint med at chancen her skulle være 35%. I det aktuelle eksempel gælder der at:

    if (20<49 && 49<=20+35)

- hvilket er sand. Derfor kaldes return med værdien "hej2", og funktionen er så færdig (return afbryder resten af funktionen).

3c) Men havde $skaebnen f.eks. været 87 ville foreach-løkken været gået videre til næste, og sidste, gennemløb. Denne gang ville  være talt op til 55, og derfor ville if-sætningen have set sådan her ud:

    if (55<$skaebnen && $skaebnen<=55+45)

- og det er jo sandt for 87.

Jeg håber at det kastede lidt lys over det? Og, ellers må du endeligt spørge.
Avatar billede nielle Nybegynder
14. november 2005 - 19:19 #8
... og mit ½-svar :^)
Avatar billede nielle Nybegynder
14. november 2005 - 21:02 #9
Takker for point :^)
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