Avatar billede mjense173 Nybegynder
22. november 2004 - 17:03 Der er 11 kommentarer og
1 løsning

Udregning af odds systemer

Når man odds'er kan man vælge at lave system odds.
Foreksempel kan man spille system: "2/3"
Hvilke betyder at man skal have 2 rigtige ud af 3 kampe for at få gevinst.

Får man netop 2 rigtige er det nemt at udregne gevinst, da det bare er odds1*odds2*indsats=gevindst.

Men hvis man har 3 rigtige skal man finde alle muligheder for at få 2 rigtige, og lægge dem sammen:

(odds1*odds2 + odds1*odds3 + odds2*odds3) * indsats = gevinst.

Dette er jo nemt nok, når der ikke er så mange..

Men hvis man foreksempel spiller system "3/6" så er der 20 mulige kombinationer af 3 rigtige ud af 6.

Jeg ønsker en funktion der kan returnere resultatet:

funktion udregnGevinst($arrayOdds,$systemA,$systemB){
  ...
}


$systemA = 3  //system "3/6"
$systemB = 6
$arrayOdds[] = 1.3
$arrayOdds[] = 2.5
$arrayOdds[] = 3.4
$arrayOdds[] = 4.3
$arrayOdds[] = 5.2
$arrayOdds[] = 6.1
echo udregnGevinst($arrayOdds,$systemA,$systemB);
Avatar billede coderdk Praktikant
22. november 2004 - 20:37 #1
hehehe sjov opgave, måtte lige have fat i en algoritmebog, da lige var lidt fjernt - Oven i det synes jeg ikke lige jeg kunne få eksemplet til at virke helt - men denne burde virke :)
Bemærk at du skal multiplicere det som funktionen returnerer med din indsats...

<?php

    class nkComb
    {
        var $numLeft;
        var $total;
        var $n;
        var $k;
        var $subset;

        function nkComb( $n, $k )
        {
            $this->n = $n;
            $this->k = $k;
            $nF = $this->fact( $n );
            $kF = $this->fact( $k );
            $nmkF = $this->fact( $n - $k );
            $this->total = $nF / ( $kF * $nmkF );
            $this->subset = array();
            for ( $i = 0; $i < $k; $i++ )
            {
                $this->subset[0][ $i ] = $i;
            }
            $this->numLeft = $this->total - 1;
            while ( $this->getCombination() )
                ;
        }

        function getIndexMatrix()
        {
            return $this->subset;
        }

        function fact( $n )
        {
            $f = 1;
            for ( $i = $n; $i > 1; $i-- )
            {
                $f *= $i;
            }
            return $f;
        }

        function getCombination()
        {
            if ( $this->numLeft == $this->total )
            {
                $this->numleft--;
            }
            else
            {
                $nCur = count( $this->subset ) - 1;
                $curSubset = $this->subset[ $nCur ];
                $x = $this->k - 1;
                while ( $curSubset[ $x ] == $this->n - $this->k + $x )
                {
                    $x--;
                }

                $curSubset[ $x ]++;

                for ( $y = ( $x + 1 ); $y < $this->k; $y++ )
                {
                    $curSubset[ $y ] = $curSubset[ $x ] + $y - $x;
                }
                $this->subset[ $nCur + 1 ] = $curSubset;
                $this->numLeft--;
            }
            return $this->numLeft != 0;
        }
       
    }

    function udregnGevinst( $oddsArray, $k, $n )
    {
       
        $comb = new nkComb( $n, $k );
        $matrix = $comb->getIndexMatrix();
        $n = count( $matrix );
        $total = 0;
        for ( $i = 0; $i < $n; $i++ )
        {
            $mul = 1;
            for ( $j = 0; $j < $k; $j++ )
            {
                $mul *= $matrix[ $i ][ $j ];
            }
            $total += $mul;
        }
        return $total;
    }

    $systemA = 3;  //system "3/6"
    $systemB = 6;
    $arrayOdds[] = 1.3;
    $arrayOdds[] = 2.5;
    $arrayOdds[] = 3.4;
    $arrayOdds[] = 4.3;
    $arrayOdds[] = 5.2;
    $arrayOdds[] = 6.1;

    echo udregnGevinst( $arrayOdds, $systemA, $systemB );

?>
Avatar billede mjense173 Nybegynder
22. november 2004 - 20:42 #2
Tester den lige. og vender tilbage... uhh det er spændende!
Avatar billede coderdk Praktikant
22. november 2004 - 22:23 #3
Hvis du undrer dig over at det ikke virker, er det fordi jeg har glemt noget ;)

  $mul *= $matrix[ $i ][ $j ];

Skulle selvfølgelig være:

  $mul *= $oddsArray[ $matrix[ $i ][ $j ] ];

Det faldt mig ind mens jeg sad og læste "The Da Vinci Code" i Metro'en på vej hjem :P
Avatar billede mjense173 Nybegynder
22. november 2004 - 23:03 #4
Ja, det faldt mig godt nok ind at der var et eller andet galt.. da jeg prøvede at analysere din metode..
Man kan også bruge metoden gmp_fact(int a) til fakultet.

Jeg kigger videre på det, med stor facination.
Avatar billede coderdk Praktikant
22. november 2004 - 23:06 #5
Ja, hvis du har kompileret gmp med ind i php ;)
Avatar billede coderdk Praktikant
22. november 2004 - 23:08 #6
Du kan undersøge om den har fået alle permutationer med ved i mellem disse to liner:

        $matrix = $comb->getIndexMatrix();
        $n = count( $matrix );

At indsætte:

        $matrix = $comb->getIndexMatrix();
        echo "<pre>"; var_dump( $matrix ); echo "</pre>";
        $n = count( $matrix );

Den skulle gerne give dig en pæn oversigt over $arrayOdds indekser...
Avatar billede mjense173 Nybegynder
24. november 2004 - 16:55 #7
Dette script er simpelthen genialt!!!

Det virker præcis som det skal, og i alle de tilfælde jeg kunnet komme på.

Du har reddet projektet, som jeg ellers var ved at give op. Tak for det.
Avatar billede coderdk Praktikant
24. november 2004 - 17:06 #8
Det var så lidt :) Jeg kom til at bruge lidt mere tid på det end jeg havde forventet, men det er nu sjovt med lidt udfordring en gang imellem ;)
Avatar billede mjense173 Nybegynder
24. november 2004 - 17:21 #9
Ja, det kan jeg se. Og du må endelig sige til hvis jeg kan gøre noget til gengæld. Du har som sagt redet min dag/uge, så det er da en flot præstation!
Avatar billede coderdk Praktikant
24. november 2004 - 18:51 #10
Det er helt ok, glad for at du kunne bruge det :)
Avatar billede mjense173 Nybegynder
25. november 2004 - 00:37 #11
Du kan se det i funktion her:
http://www.jomfrubussen.dk/aarhusit/attention8/oddset/nkComb.php
Sammen med de andre sjove scripts.. :-)
Avatar billede mjense173 Nybegynder
25. november 2004 - 00:38 #12
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