Autor Thema: Formel für Pathfinder PointBuy  (Gelesen 2265 mal)

Beschreibung: Vorsicht: Geek Stuff

0 Mitglieder und 1 Gast betrachten dieses Thema.

Feuerrabe

  • Beiträge: 123
    • Profil anzeigen
Formel für Pathfinder PointBuy
« am: 23.11.2014, 15:05:24 »
Da ich gerne Würfelmethoden bei der Attributegenerierung mit der Point-Buy Methode vergleiche, rechne ich gerne Erwartungswerte und Standardabweichung bei Würfelmethoden aus. Bis jetzt ging es mir dabei immer um den Attributwert, die ich am Ende mit dem Schnitt dessen, was man sich maximal mit Point-Buy kaufen könnte verglichen, wollte aber dazu übergehen, den zu erwartenden Point-Buy Wert und die Standardabweichung davon zu berechnen.

Dafür müsste ich natürlich nur Point-Buy Werte von drei bis sieben zusätzlich definieren, andere Attributwerte kommen bei Würfelmethoden normalerweise nicht vor und da die Systematik bekannt ist, ist das ja auch keine große Sache.

Allerding, um der Herausforderung willen (mein Verstand soll ja nicht einrosten)  und um Fragen wie: "Welchen Point Buy Wert hätten Lathanders Attribute wohl in Pathfinder?" zu beantworten habe das ganze in eine Funktion gepackt um jeden Point-Buy Wert einer ganzen Zahl zu berechnen.

Von folgenden Annahmen bin ich ausgegangen:
pb(10) = 0
pb(11) = 1
Alle zwei Zahlen wir die kostet der jeweils nächste Punkte einen mehr, dh:
für eine Ganzzahl n > 11 gilt: pb(n) = pb(n-1) + floor((n-10) / 2)
außerdem Spiegeln sich die Ergebnisse um die 10 herum.

Nachdem ich die Rekursion rausgerechnet habe kam ich auf folgendes Ergebnis, formuliert in C:
/**
 * Calculates the Pathfinder point buy value.
 *
 * Formula in more readable terms:
 * n is element of all integers
 * dn shall be the difference from n to 10
 * if n is even and n > 10 the pb(n) is (dn * dn + 4) / 4
 * if n is uneven and n > 10 the pb(n) is (dn * dn + 3) / 4
 * if n < 10 then 10 pb(n) is the negative of results for n > 10
 * (consequently pb(n) = pb(20-n) * -1, but that's not the point)
 * pb(10) is 0
 *

 *
 * @param int n Attribute value
 * @return int point buy value of n
 */
int pb(int n) {
int dn = n - 10;
return dn ? ((dn * dn + 3 + ((n & 1) ^ 1)) >> 2) * (n > 10 ? 1 : -1) : 0;
// simpler, mit math.h:
// if (n == 10) return 0;
// else return (dn * dn + 3 + abs(n+1) % 2) / 4 * abs(dn)/dn;
}

Am Ende dachte ich nur: Wahrscheinlich hätte ich vermutlich auch einfacher draufkommen können. (n - 10)² / 4 + 1 (für gerade Attributwerte größer als 10) - noch banaler geht's ja kaum.
Um den Point-Buy Wert von Lathanders Attributen zu berechnen müsste ich die jetzt natürlich erst mal wiederfinden.