1   import java.util.Scanner;
2   /**
3    * 183.592 Programmierpraxis TU Wien WS2014/15 H.Moritsch
4    * Random-Surfer Modell zur Berechnung des PageRank einer Webseite
5    * s. R. Sedgewick, K. Wayne. Introduction to Programming in 
6    * Java: An Interdisciplinary Approach. Addison-Wesley, 2008.
7    * Aufruf: java RandomSurfer < randomsurfer.dat
8    */
9   public class RandomSurfer {
10      public static void main(String[] args) {
11  
12          Scanner scanner = new Scanner(System.in);
13  
14          /* 1. Einlesen der Webstruktur (Seiten und Links) */
15  
16          // Anzahl der Seiten
17          Page[] pages = new Page[scanner.nextInt()];
18  
19          // für jede Seite (i):
20          for (int i=0; i<pages.length; i++) {
21  
22              // Erzeugen des Page-Objekts mit URL und Anzahl der Links auf der Seite
23              pages[i] = new Page(scanner.next(), scanner.nextInt());
24  
25          }
26  
27          // für jede Seite (i):
28          for (int i=0; i<pages.length; i++) {
29              System.out.print((i+1) + ". " + pages[i].getURL() + " -> ");
30  
31              // für jeden Link auf dieser Seite (j):
32              for (int j=0; j<pages[i].getDegree(); j++) {
33  
34                  // Nummer der Seite, auf die der Link verweist (k)
35                  int k = scanner.nextInt();      
36  
37                  // Eintragen des Links: auf der i.ten Seite verweist 
38                  // der j.te Link auf das Page-Objekt "pages[k-1]"
39                  pages[i].setLink( j, pages[k-1] ); 
40  
41                  System.out.print(pages[k-1].getURL() + " ");
42  
43                  }
44              System.out.println();
45              }
46  
47          /* 2. Random-Surfer surft */
48  
49          Page currentPage = pages[0];                // startet mit der ersten Seite
50  
51          System.out.println("start page: "+currentPage.getURL());
52  
53          int totalVisits = scanner.nextInt();        // Anzahl der durchzuführenden Seitenaufrufe
54  
55          int visitCount = 1;                         // zählt Anzahl der Seitenaufrufe insgesamt     
56          while ( visitCount++ < totalVisits ) {
57  
58              /* Random-Surfer sitzt vor dem Browser und hat eine Seite vor sich. 
59                 Welche Seite sieht er sich als nächste an? 
60              */
61  
62              if (Math.random() < 0.90) {
63                  // in 90% aller der Fälle wählt er irgendeinen der *Links* auf 
64                  // der aktuellen Seite (nach Zufallsprinzip)
65  
66                  // k ist eine Zufallszahl zwischen 0 und (Anzahl der Links - 1)
67                  int k = (int)( Math.random() * currentPage.getDegree());
68  
69                  // gehe zur Seite, auf die dieser Link verweist
70                  currentPage = currentPage.getLink(k);
71  
72                  // System.out.println("90%: "+currentPage.getURL());
73  
74              }
75  
76              else {
77                  // in den restlichen 10% der Fälle wählt er irgendeine der 
78                  // vorhandenen *Seiten* (nach Zufallsprinzip)
79  
80                  // k ist eine Zufallszahl zwischen 0 und (Anzahl der Seiten - 1)
81                  int k = (int)( Math.random() * pages.length );
82  
83                  // gehe zu dieser Seite
84                  currentPage = pages[k];
85  
86                  // System.out.println("10%: "+currentPage.getURL());
87  
88              }
89  
90              currentPage.incrementCount();           // Hitcount der neuen Seite wird erhöht
91  
92          }
93  
94          /* 3. Ausgabe der Hitcounts */
95  
96          System.out.println("total visits: " + totalVisits);
97            
98          // für jede Seite (i):
99          for (int i=0; i<pages.length; i++) 
100             System.out.println( pages[i].getURL() + ": " + 
101                               ( pages[i].getCount() / (totalVisits/100.0) ) + " % of visits" );
102 
103     }
104 
105 }
106