Einzelnen Beitrag anzeigen

Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#20

Re: Mehr Speed für Random?

  Alt 25. Jul 2007, 23:12
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.
  Mit Zitat antworten Zitat