蒙特卡洛法多线程求圆周率

原创 2016年05月31日 09:35:02
#include<iostream>
#include<string>
#include<pthread.h>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<cstdio>
#include<sys/time.h>
#define MAX 100000000
using namespace std;
double result = 0;
int thread_num;
int Every_P;
pthread_mutex_t mut;
void *t_hread(void *arg){
    int m = *(int*)arg;
    if(m != thread_num - 1){
        for(int i = m * Every_P;i < (m + 1) * Every_P;i++){
	    	double x = sqrt(MAX) * sqrt(MAX - ((i + 0.5)/MAX)*(i + 0.5));
	    	int xx = x;
	    	double count;
	    	if((x - xx) > 0.5){
				count = xx + 1; 		
	    	}
	    	else{
				count = xx;
	    	}
	    	pthread_mutex_lock(&mut);
	    	result = result + (double)count/MAX;
	    	pthread_mutex_unlock(&mut);							
		}	
    }
    if(m == thread_num - 1){
		for(int i = m * Every_P;i < MAX;i++){
	   		double x = sqrt(MAX) * sqrt(MAX - ((i + 0.5)/MAX)*(i + 0.5));
	    	int xx = x;
	    	double count;
	    	if((x - xx) > 0.5){
				count = xx + 1; 		
	    	}
	    	else{
				count = xx;
	    	}
	    	pthread_mutex_lock(&mut);
	    	result = result + (double)count/MAX;
	    	pthread_mutex_unlock(&mut);			
		}
    }  
}
int main(int argc,char *argv[]){
    thread_num = atoi(argv[1]);
    pthread_t thread[thread_num];
    Every_P = MAX/thread_num;
    pthread_mutex_init(&mut,NULL);
    int id[thread_num];
    struct timeval begin,end;
    gettimeofday(&begin,NULL);
    for(int i = 0;i < thread_num;i++){
		id[i] = i;
        int err = pthread_create(&thread[i],NULL,t_hread,(void*)&id[i]);
    }
    for(int i = 0;i < thread_num;i++){
		pthread_join(thread[i],NULL);
    }
    gettimeofday(&end,NULL);
    double pi = result/MAX * 4;
    cout<<"pi is:"<<fixed<<setprecision(15)<<pi<<endl;
    int time = (end.tv_sec - begin.tv_sec) * 1000000 + (end.tv_usec - begin.tv_usec);
    printf("time: %d us\n", time);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

各种求圆周率π的算法(蒙特卡洛法的Java实现)

算法就是有穷规则构成的用于解决某一类问题的运算序列或执行步骤。要解决一个问题可能会有不同的方法,针对求圆周率π的近似值这个问题你能想到多少种算法呢?本文讨论三种计算方法,并在Java中实现其中基于蒙特...

蒙特卡洛法求圆周率

利用蒙特卡洛算法求圆周率是一个概率的方法,关于这方面的内容很多,而且也很容易理解,更多具体分析过程可以参考如下文章: http://blog.csdn.net/zzhflyqh/article/de...

2014腾讯实习生笔试——蒙特卡洛算法求圆周率

这是2014腾讯实习生笔试(西安,武汉站)的第26题。给出二个函数,让你去理解其含义。答案是:第一个函数式用来产生(a,b)之间的随机小数。第二个函数式用蒙特卡洛概率算法求近似圆周率。 先介绍一下该...

蒙特卡洛方法——玩具例子(1)圆周率

蒙特卡洛方法的玩具程序之圆周率

多线程求行列式值

#include #include #include #include #include #include #include #include using namespace std; #define...

开发多线程篇—GCD的常见用法

一、延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)