Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Random;
- public class MonteCarloMultiThread {
- public static void main(String[] args) {
- calcPI(1,10_000_000L);
- }
- static void calcPI(int nThreads, long nTrials) {
- MonteCarloPICalculator[] calculators = new MonteCarloPICalculator[nThreads];
- Thread[] ths = new Thread[nThreads];
- for(int i=0; i<nThreads; i++ ) {
- final MonteCarloPICalculator calculator = new MonteCarloPICalculator("Thread "+ i , nTrials/nThreads);
- calculators[i] = calculator;
- ths[i] = new Thread(){
- public void run() {
- calculator.calcPI();;
- }
- };
- }
- long start = System.currentTimeMillis();
- for(int i=0; i<nThreads; i++) {
- ths[i].start();
- }
- for(int i=0; i<nThreads; i++) {
- try {
- ths[i].join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- long time = System.currentTimeMillis() - start;
- long count = 0;
- for(int i=0; i<nThreads; i++) {
- count += calculators[i].getCount();
- calculators[i].printResult();
- }
- double result = count / (double)nTrials * 4.0;
- System.out.println("====================");
- System.out.println("All");
- System.out.println("nThreads : " + nThreads );
- System.out.println("nTrials : " + nTrials );
- System.out.println("count : " + count );
- System.out.println("time[ms] : " + time );
- System.out.println();
- System.out.println("result : " + result );
- System.out.println("Math.PI : " + Math.PI );
- System.out.printf( "Error : %.1E" , Math.abs( Math.PI - result) );
- }
- }
- class MonteCarloPICalculator {
- private final String name;
- private final long nTrials;
- private long count = 0;
- private long time;
- private final Random ran = new Random();
- public MonteCarloPICalculator(String name, long nTrials) {
- this.name = name;
- this.nTrials = nTrials;
- }
- public void calcPI() {
- long start = System.currentTimeMillis();
- for(int i=0; i<nTrials; i++) {
- double x = ran.nextDouble();
- double y = ran.nextDouble();
- if( x*x + y*y < 1.0 ) count++;
- }
- time = System.currentTimeMillis() - start;
- }
- public void printResult() {
- System.out.println("--------------------");
- System.out.println(name);
- System.out.println("nTrials : " + nTrials);
- System.out.println("count : " + count);
- System.out.println("time[ms] : " + time);
- System.out.println("result : " + count / (double)nTrials * 4.0);
- }
- public long getCount() {
- return count;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement