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);
Annonceindlæg fra Kingston Technology
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 ); ?>
22. november 2004 - 20:42
#2
Tester den lige. og vender tilbage... uhh det er spændende!
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
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.
22. november 2004 - 23:06
#5
Ja, hvis du har kompileret gmp med ind i php ;)
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...
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.
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 ;)
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!
24. november 2004 - 18:51
#10
Det er helt ok, glad for at du kunne bruge det :)
25. november 2004 - 00:38
#12
Vi tilbyder markedets bedste kurser inden for webudvikling