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..
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
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
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).
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
$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);)
$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..
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));
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.