001    /*
002     * RandomLastDigit.java
003     *
004     * Created on 8. Januar 2004, 23:19
005     */
006    
007    package randomLD;
008    
009    /**
010     *
011     * @author  Florian Hiemeyer
012     * @version 1.00
013     */
014    /**
015     * Die Klasse kalkuliert zufällige Band und Seitennummern, aus denen
016     * eine (ebenfalls zufällige) Telefonnummer herausgesucht werden soll.
017     * Die tatsächlich mit Telefonnummern besetzten Zahlen werden im Konstanten
018     * Array ANZ_SEITEN gesetzt!
019     * Zusätzlich werden noch zwei "random last digits" bestimmt, die statt der 
020     * letzten zwei Ziffern der zufällig gewählten Telefonnummer gewählt werden.
021     * (als 2. Telefonnummer, zusätzlich zur eigentlichen Telefonbuchnummer)
022     **/
023    public class RandomLastDigit {
024        /**
025         * Verfahren: 1. Zahl: Beginn des Telefonbuchteils von Band1,
026         *            2. Zahl: Ende des Telefonbuchteils von Band1,
027         *            3. Zahl: Beginn des Telefonbuchteils von Band2,
028         *            4. Zahl: etc.
029         */
030        private static final int [] ANZ_SEITEN = new int [] {50   , 51,
031                                                            1000 , 1001};    
032        
033        /** 
034         * Anzahl der Nummern, die gezogen werden soll!
035         */                                                    
036        private static final int ANZ_NUMMERN = 1000;  
037        
038        /** Anzahl der Baende */
039        int numBaende = (int)Math.round(ANZ_SEITEN.length/(double)2);
040       
041        /** Gewählter Band */
042        private int band[] = new int[ANZ_NUMMERN];
043        /** Gewählte Seite */
044        private int seite[] = new int[ANZ_NUMMERN];
045        /** random last digits */
046        private int rld2[] = new int[ANZ_NUMMERN];
047        
048        
049        /** Creates a new instance of RandomLastDigit */
050        public RandomLastDigit() {
051            run();
052        }
053        
054        public final void run() {
055            for (int i = 0;i<ANZ_NUMMERN;i++)
056                calcNewTelNum(i);
057        }  
058        
059        /** Berechnet neue Werte für das Objekt */
060        public final void calcNewTelNum(int j) {
061          if(ANZ_SEITEN.length%2 != 0)
062              System.out.println("FEHLER! Telefonbandangaben fehlerhaft!");
063           
064          //eff. Seiten Zahl der Einzelnen Baende;
065          int seiten[] = new int [numBaende];
066           
067          // Berechnung der Gesamtzahl der Seiten und der effektiven 
068          // Seitenzahl pro Band
069          int gesamtSeiten = 0;
070          for ( int i = 0, temp=0; i<numBaende;i++) {
071               temp = ANZ_SEITEN[2*i+1]-ANZ_SEITEN[2*i]+1;
072               seiten[i] = temp;
073               gesamtSeiten += temp;
074          }
075          
076          // Bestimme Seite (aus Gesamtseiten)
077          int tempSeite = (int)Math.round(Math.random()*gesamtSeiten                                                                                              );
078           
079          // Bestimme zugehörigen Band und seite = nr. im gewählten Band
080          for(int i = 0,seitenBisher = 0, seitenBisherAlt = 0;i<numBaende;i++) {
081               seitenBisher += seiten[i];
082               if (tempSeite <= seitenBisher) {
083                   band[j] = i+1;
084                   seite[j] = ANZ_SEITEN[2*i]+ tempSeite - seitenBisherAlt;
085                   break;
086               }
087               seitenBisherAlt = seitenBisher;
088           }    
089                   
090           /**
091           
092           // Berechnung des Telefonbuchbandes
093           band = (int)(Math.floor(Math.random()*numBaende))+1;
094           
095           // effektive Anzahl von Seiten (die mit Telefonnummern bedruckt sind)
096           int effSeiten = ANZ_SEITEN[2*band-1]-ANZ_SEITEN[2*(band-1)]+1;
097           
098           // Berechnung der Seite
099           seite = ANZ_SEITEN[2*(band-1)]+((int)Math.floor(Math.random()*effSeiten));
100            */
101            
102           // Random Last Digits (2 Stück)
103           rld2[j] = (int)(Math.random()*100);
104        }
105        
106        /** Die Methode liefert den Status des Objekts */
107        public String toString() {
108            StringBuffer temp = new StringBuffer("band,seite,rld2\n");
109            
110            // Speichere Ergebnisse in temp
111            // Wenn rld2 < 10: Dann 0x ausgeben (x= rld2)
112            String rldString = new String();
113            for(int i=0;i<ANZ_NUMMERN;i++) {
114                if (rld2[i]<10)
115                    rldString = new String("0"+rld2[i]);
116                else
117                    rldString = Integer.toString(rld2[i]);
118                temp.append(new String(band[i] + "," + seite[i] + "," + rldString+"\n"));
119            }
120            return new String(temp);
121        }  
122        
123        public static void main (String[] args) {
124          // Objekt initialisieren
125          RandomLastDigit rld = new RandomLastDigit();
126          // Den Status des Objekts "rld" ausgeben!
127          System.out.println(rld);
128        }
129    }