Ich habe mal meine Idee grob umgesetzt. Ein paar Feinheiten fehlen noch und man muss an ein paar Stellen noch mal etwas denken. Da ich gerade Java lernen muss, habe ich es mal in der Sprache geschrieben, was es macht, sollte klar sein. (i++; ist identisch mit i:=i+1
Code:
public class WarHammer {
int n=20; // maximale Anzahl an Würfeln in einem Wurf
int augenMax=6; // maximale Augenzahl auf einem Würfel
float[] fac = new float[n];
float[][][] pList = new float[n][augenMax][augenMax+1];
public static void main(String[] args) {
}
int WURF(int wurfel, int ziel) {
float p = 1-(ziel-1)/augenMax;
int EW = Math.round(wurfel*p);
float x = (float) Math.random();
if (pList[wurfel][ziel][EW] > x ) {
int i = EW-1;
while (pList[wurfel][ziel][i] > x) {
i--;
}
return i; // oder i+-1 ??
} else {
int i = EW+1;
while (pList[wurfel][ziel][i] <= x) {
i++;
}
return i; // oder i+-1 ??
}
}
void InipList() {
for (int wurfel=0; wurfel<=n;wurfel++) { // Anzahl benutze Würfel
for (int ziel=1;ziel<=augenMax;ziel++){ // zu erreichende Augenzahl
for (int treffer=0; treffer<=augenMax; treffer++){ // anzahl treffende Würfe
// hier werden die eigentlichen Wahrscheinlichkeiten ausgerechnet:
int binom = binKoeff(wurfel, treffer); // (wurfel über erg
float p = 1-(ziel-1)/augenMax; // wahrscheinlichkeit zu treffen
// Binomialverteilung
pList[wurfel][ziel][treffer] = (float) (binom*Math.pow(p, treffer)*Math.pow(n-p,1-p));
}
}
}
}
int binKoeff(int n, int k) {
// hier fehlen noch ein paar Sonderfälle
return (int) (fac[n]/(fac[n-k]*fac[k]));
}
void IniFac() {
fac[0]=fac[1]=1;
for (int i=2;i<=n;i++) fac[i]=i*fac[i-1];
}
}
Erwarte das Beste und bereite dich auf das Schlimmste vor.