Advertisement
Guest User

Untitled

a guest
Apr 18th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.55 KB | None | 0 0
  1. import java.util.Random;
  2.  
  3. public class MonteCarloMultiThread {
  4.     public static void main(String[] args) {
  5.         calcPI(1,10_000_000L);
  6.     }
  7.    
  8.     static void calcPI(int nThreads, long nTrials) {
  9.         MonteCarloPICalculator[] calculators = new MonteCarloPICalculator[nThreads];
  10.         Thread[]                 ths         = new Thread[nThreads];
  11.        
  12.         for(int i=0; i<nThreads; i++ ) {
  13.             final MonteCarloPICalculator calculator = new MonteCarloPICalculator("Thread "+ i , nTrials/nThreads);
  14.             calculators[i] = calculator;
  15.            
  16.             ths[i] = new Thread(){
  17.                 public void run() {
  18.                     calculator.calcPI();;
  19.                 }
  20.             };
  21.         }
  22.        
  23.         long start = System.currentTimeMillis();
  24.        
  25.         for(int i=0; i<nThreads; i++) {
  26.             ths[i].start();
  27.         }
  28.        
  29.         for(int i=0; i<nThreads; i++) {
  30.             try {
  31.                 ths[i].join();
  32.             } catch (InterruptedException e) {
  33.                 e.printStackTrace();
  34.             }
  35.         }
  36.        
  37.         long   time  = System.currentTimeMillis() - start;
  38.         long   count = 0;
  39.        
  40.         for(int i=0; i<nThreads; i++) {
  41.             count += calculators[i].getCount();
  42.             calculators[i].printResult();
  43.         }
  44.        
  45.         double result = count / (double)nTrials * 4.0;
  46.        
  47.         System.out.println("====================");
  48.         System.out.println("All");
  49.         System.out.println("nThreads  : "     + nThreads );
  50.         System.out.println("nTrials   : "     + nTrials );
  51.         System.out.println("count     : "     + count );
  52.         System.out.println("time[ms]  : "     + time );
  53.         System.out.println();
  54.         System.out.println("result    : "     + result );
  55.         System.out.println("Math.PI   : "     + Math.PI );
  56.         System.out.printf( "Error     : %.1E" , Math.abs( Math.PI - result) );
  57.     }
  58. }
  59.  
  60. class MonteCarloPICalculator {
  61.     private final String name;
  62.     private final long   nTrials;
  63.     private long         count = 0;
  64.     private long         time;
  65.    
  66.     private final Random ran = new Random();
  67.    
  68.     public MonteCarloPICalculator(String name, long nTrials) {
  69.         this.name    = name;
  70.         this.nTrials = nTrials;
  71.     }
  72.    
  73.     public void calcPI() {
  74.         long start = System.currentTimeMillis();
  75.        
  76.         for(int i=0; i<nTrials; i++) {
  77.             double x = ran.nextDouble();
  78.             double y = ran.nextDouble();
  79.            
  80.             if( x*x + y*y < 1.0 ) count++;
  81.         }
  82.        
  83.         time = System.currentTimeMillis() - start;
  84.     }
  85.    
  86.     public void printResult() {
  87.         System.out.println("--------------------");
  88.         System.out.println(name);
  89.         System.out.println("nTrials   : " + nTrials);
  90.         System.out.println("count     : " + count);
  91.         System.out.println("time[ms]  : " + time);
  92.         System.out.println("result    : " + count / (double)nTrials * 4.0);
  93.     }
  94.  
  95.     public long getCount() {
  96.         return count;
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement