/*
 * RandomLastDigit.java
 *
 * Created on 8. Januar 2004, 23:19
 */

package randomLD;

/**
 *
 * @author  Florian Hiemeyer
 * @version 1.00
 */
/**
 * Die Klasse kalkuliert zufällige Band und Seitennummern, aus denen
 * eine (ebenfalls zufällige) Telefonnummer herausgesucht werden soll.
 * Die tatsächlich mit Telefonnummern besetzten Zahlen werden im Konstanten
 * Array ANZ_SEITEN gesetzt!
 * Zusätzlich werden noch zwei "random last digits" bestimmt, die statt der 
 * letzten zwei Ziffern der zufällig gewählten Telefonnummer gewählt werden.
 * (als 2. Telefonnummer, zusätzlich zur eigentlichen Telefonbuchnummer)
 **/
public class RandomLastDigit {
    /**
     * Verfahren: 1. Zahl: Beginn des Telefonbuchteils von Band1,
     *            2. Zahl: Ende des Telefonbuchteils von Band1,
     *            3. Zahl: Beginn des Telefonbuchteils von Band2,
     *            4. Zahl: etc.
     */
    private static final int [] ANZ_SEITEN = new int [] {50   , 51,
                                                        1000 , 1001};    
    
    /** 
     * Anzahl der Nummern, die gezogen werden soll!
     */                                                    
    private static final int ANZ_NUMMERN = 1000;  
    
    /** Anzahl der Baende */
    int numBaende = (int)Math.round(ANZ_SEITEN.length/(double)2);
   
    /** Gewählter Band */
    private int band[] = new int[ANZ_NUMMERN];
    /** Gewählte Seite */
    private int seite[] = new int[ANZ_NUMMERN];
    /** random last digits */
    private int rld2[] = new int[ANZ_NUMMERN];
    
    
    /** Creates a new instance of RandomLastDigit */
    public RandomLastDigit() {
        run();
    }
    
    public final void run() {
        for (int i = 0;i<ANZ_NUMMERN;i++)
            calcNewTelNum(i);
    }  
    
    /** Berechnet neue Werte für das Objekt */
    public final void calcNewTelNum(int j) {
      if(ANZ_SEITEN.length%2 != 0)
          System.out.println("FEHLER! Telefonbandangaben fehlerhaft!");
       
      //eff. Seiten Zahl der Einzelnen Baende;
      int seiten[] = new int [numBaende];
       
      // Berechnung der Gesamtzahl der Seiten und der effektiven 
      // Seitenzahl pro Band
      int gesamtSeiten = 0;
      for ( int i = 0, temp=0; i<numBaende;i++) {
           temp = ANZ_SEITEN[2*i+1]-ANZ_SEITEN[2*i]+1;
           seiten[i] = temp;
           gesamtSeiten += temp;
      }
      
      // Bestimme Seite (aus Gesamtseiten)
      int tempSeite = (int)Math.round(Math.random()*gesamtSeiten                                                                                              );
       
      // Bestimme zugehörigen Band und seite = nr. im gewählten Band
      for(int i = 0,seitenBisher = 0, seitenBisherAlt = 0;i<numBaende;i++) {
           seitenBisher += seiten[i];
           if (tempSeite <= seitenBisher) {
               band[j] = i+1;
               seite[j] = ANZ_SEITEN[2*i]+ tempSeite - seitenBisherAlt;
               break;
           }
           seitenBisherAlt = seitenBisher;
       }    
               
       /**
       
       // Berechnung des Telefonbuchbandes
       band = (int)(Math.floor(Math.random()*numBaende))+1;
       
       // effektive Anzahl von Seiten (die mit Telefonnummern bedruckt sind)
       int effSeiten = ANZ_SEITEN[2*band-1]-ANZ_SEITEN[2*(band-1)]+1;
       
       // Berechnung der Seite
       seite = ANZ_SEITEN[2*(band-1)]+((int)Math.floor(Math.random()*effSeiten));
        */
        
       // Random Last Digits (2 Stück)
       rld2[j] = (int)(Math.random()*100);
    }
    
    /** Die Methode liefert den Status des Objekts */
    public String toString() {
        StringBuffer temp = new StringBuffer("band,seite,rld2\n");
        
        // Speichere Ergebnisse in temp
        // Wenn rld2 < 10: Dann 0x ausgeben (x= rld2)
        String rldString = new String();
        for(int i=0;i<ANZ_NUMMERN;i++) {
            if (rld2[i]<10)
                rldString = new String("0"+rld2[i]);
            else
                rldString = Integer.toString(rld2[i]);
            temp.append(new String(band[i] + "," + seite[i] + "," + rldString+"\n"));
        }
        return new String(temp);
    }  
    
    public static void main (String[] args) {
      // Objekt initialisieren
      RandomLastDigit rld = new RandomLastDigit();
      // Den Status des Objekts "rld" ausgeben!
      System.out.println(rld);
    }
}

