Avatar billede shjorth Nybegynder
24. juni 2008 - 19:51 Der er 16 kommentarer og
1 løsning

php - matematik

Hejsa.

Det er nok nærmere et matematisk spørgsmål end egentlig programmering.
MEN:

Jeg er level 57 og min ven er level 23 -> Hvor mange procents chance er der for at jeg vinder?

og

Jeg er level 23 og min ven er level 57 -> Hvor mange procents chance er der for at jeg vinder?

og hvorledes kan man med PHP lave en sådan udregning ?

Mange tak
Avatar billede olebole Juniormester
24. juni 2008 - 20:58 #1
<ole>

Det må vel kræve, man kender betydningen af de forskellige levels  =)

/mvh
</bole>
Avatar billede net-base.dk Nybegynder
24. juni 2008 - 23:21 #2
eller er der vel 247,8260869565217391304347826087% change for at en lvl 57 kan vinde over en lvl 23 :D
Avatar billede shjorth Nybegynder
24. juni 2008 - 23:37 #3
Hvordan er du nået frem til det?
Avatar billede net-base.dk Nybegynder
25. juni 2008 - 00:12 #4
100% / 23 * 57 = 247,8260869565217391304347826087

Men det er nok ikke den smarteste måde at udregne det på :D
Avatar billede pidgeot Nybegynder
25. juni 2008 - 00:33 #5
En mulighed var vel at se hvor mange procent af de samlede levels det udgør:

23/(57+23) = 23/80 = 28.75%
57/(57+23) = 57/80 = 71.25%

...men som Ole siger, uden at vide hvad forholdet er, så kan vi jo kun gætte
Avatar billede area404 Nybegynder
25. juni 2008 - 00:41 #6
hvis det drejer sig om et "spil" hvor man kan udfordre hinanden ville jeg bruge pidgeot's forslag, og så generere et tilfældigt tal mellem 0 og 100 og samligne med dine procenttal. Derved har level 57 den bedste mulighed for at vinde udfordringen..
bare et gæt..
Avatar billede pidgeot Nybegynder
25. juni 2008 - 10:29 #7
Andre muligheder kunne være levelA^2/(levelA+levelB)^2 eller levelA^2/(levelA^2+levelB^2), for på den måde at favorise den med højest level yderligere - men som sagt, det kommer helt an på hvilken betydning de forskellige levels har
Avatar billede shjorth Nybegynder
25. juni 2008 - 12:11 #8
Hej pidgeot.

Jeg kan godt lide ideen om at favoriserer den high level endnu mere. Jeg kan dog ikke umidlebart få din funktion til at virke. Hvis vi begge er 30, skulle den jo gerne komme med 50%.

Betydningen af de forskellige levels er såment bare jo højere, jo bedre. Er du level 3000 mod en level 1.. Så skal der jo gerne være tæt på 100% :D
Avatar billede pidgeot Nybegynder
25. juni 2008 - 13:42 #9
Lige ideen med a^2/(a+b)^2 virker ikke, nej - det var mig der ikke havde tænkt den igennem, beklager. De to andre skulle dog ikke blive noget problem.

Selvfølgelig er en højere level bedre end en lavere, men det siger intet om HVOR MEGET bedre - jeg har forsøgt at komme med nogle forslag, men det er ikke sikkert de passer til den måde man får levels på. Hvis vi nu tager dit oprindelige eksempel, så vil den med a^2/(a^2+b^2) give:
23^2/(23^2+57^2)=0.1400212 (14%)
57^2/(23^2+57^2)=0.8599788 (86%)

Du kan selvfølgelig gøre det endnu mindre sandysnligt for level 23'eren at vinde ved at bruge noget andet end 2:
23^3/(23^3+57^3)=0.0616488 (6.16%)
57^3/(23^3+57^3)=0.9383512 (93.84%)

Bemærk i øvrigt lige at hvis dit resultat af potenserne kommer over ca. 2 milliarder, så kan PHP godt få problemer - så det skal du lige tage højde for. For at checke kan du beregne (højest mulige level)^(din valgte potens). Hvis det er mindre end eller lig med 1.073.741.823, så kan det bruges. For 2 vil det sige at du højst kan gå op til level 32767, mens det for 3 sætter en grænse på 1023 (hvilket jo så er lavere end de 3000 du nævnte).

Så en grundlæggende formel er med andre ord A^X/(A^X+B^X), hvor A og B er de to levels.

En implementation ville være noget i stil med dette (utestet, men du forstår nok princippet):

<?PHP
//$alevel er den ene persons level, $blevel er den anden, og $x er din potens
$achance=pow($alevel,$x)/(pow($blevel,$x)+pow($blevel,$x));
$bchance=1-$achance; //Vi behøver den ikke for selve beregningen af hvem der vinder, men det kan være du vil vise den
$rand=mt_rand()/mt_getrandmax();
if ($rand > $achance)
  echo 'A vinder';
else
  echo 'B vinder';
?>

Skulle $rand være = $achance (det vil gennemsnitligt ske ca. 1 ud af 2^31 gange), vinder B i den implementation. Du kan evt. ændre det så A vinder i stedet, eller du prøver igen.

Jeg mener ikke det er nødvendigt i PHP, men hvis du oplever at divisionerne giver 0, så smid (double) ind lige efter /-tegnet (inkl. paranteserne).
Avatar billede shjorth Nybegynder
25. juni 2008 - 16:12 #10
Det ser faktisk rigtig godt ud. Det er præcis det jeg leder efter.

Jeg kunne dog godt tænke mig at vise den "procentvise chance" for at vinde, er det noget der er lige til.
Jeg har prøvet med $bchance, men den giver ikke umidlebart noget der ser rigtigt ud
Avatar billede pidgeot Nybegynder
25. juni 2008 - 16:17 #11
$achance og $bchance er begge udtrykt som decimaltal mellem 0 og 1, der repræsenterer sandsynligheden. 0.5 svarer til 50%, 1 til 100%, etc.

For at vise det som en procentdel, skal du altså gange med 100, og afrunde til et passende antal decimaler (eks. 1 eller 2).

Sørg dog for du IKKE ændrer ved de to variables indhold mens du gør det - beregningen af hvem der vinder forventer nemlig at de netop er decimaltal mellem 0 og 1. Lav evt. en kopi af dem (eks. $apct=round($achance*100,2);)
Avatar billede shjorth Nybegynder
25. juni 2008 - 16:22 #12
Det ser enormt rigtigt ud. Dog får jeg nogle underlige tal hvis A har en højere level end B. Skal der så ændres på noget?
Avatar billede shjorth Nybegynder
25. juni 2008 - 16:46 #13
Jeg har forsøgt flg:

if($friend_level>$you_level) {

$alevel = $you_level; // SKAL VÆRE MIN
$blevel = $friend_level; // SKAL VÆRE MAX
$x = 2;
$achance=pow($alevel,$x)/(pow($blevel,$x)+pow($blevel,$x));
$bchance=1-$achance;

}else{

$alevel = $friend_level; // SKAL VÆRE MIN
$blevel = $you_level; // SKAL VÆRE MAX
$x = 2;
$achance=pow($alevel,$x)/(pow($blevel,$x)+pow($blevel,$x));
$bchance=1-$achance;

}

$a_final=round($achance*100,2);

og det virker egentlig også ok, men hvis jeg f.eks "udfordrer" en level 9 og jeg selv er 24, så har jeg kun 5% chance..

Skal nok lige hæve pointindsatsen ;)
Avatar billede pidgeot Nybegynder
25. juni 2008 - 17:10 #14
Du skal ikke bytte om på dem på den måde. Brug dig selv som A, og modstanderen som B (eller omvendt - bare du er konsekvent).

Der er dog en fejl i mit eksempel - sådan kan det gå når man lige skriver fra hoften:
$achance=pow($alevel,$x)/(pow($blevel,$x)+pow($blevel,$x));
skulle have været
$achance=pow($alevel,$x)/(pow($alevel,$x)+pow($blevel,$x));
Avatar billede shjorth Nybegynder
25. juni 2008 - 17:22 #15
Jeg tror jeg har fået det til at virke - med lidt af min helt specielle slam kode, og de geniale input fra dig, så ser det sku ud til at virke.

Jeg skylder dig mange tak fot hjælpen. Hvis du vil det kan jeg oprette et spørgsmål med lidt ekstra points til dig, som tak for hjælpen :)?
Avatar billede pidgeot Nybegynder
25. juni 2008 - 17:26 #16
Det behøves ikke - svar kommer her :)

(Man kan i øvrigt godt øge antal point i et eksisterende spørgsmål - kig under funktioner)
Avatar billede shjorth Nybegynder
25. juni 2008 - 17:32 #17
Jeg er dig evigt taknemmelig :D
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