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

原创 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;
}

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

网络时代课堂教学模式整合的探索

一、           网络时代课堂教学模式的再审视     可以说,教育的发展离不开教育技术的发展,而教育技术的发展又离不开网络的发展。在网络时代的今天,网络技术和网络资源更是教育的重要组成部分,...

XV6源代码阅读--进程与内存管理

由于工作和兴趣爱好的关系,接触了不少实时操作系统, 一般来说实时操作系统基本没有进程的概念了,无非是任务堆栈的切换。 一直对Linux,Windows这种带有进程的OS,很好奇,无奈,LINUX...

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

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

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

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

蒙特卡洛法求圆周率

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

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

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

并行计算多线程求π以及矩阵转置

  • 2017年04月20日 20:59
  • 46.17MB
  • 下载

IOS_多线程-GCD的其他用法

  • 2015年05月31日 07:52
  • 426B
  • 下载

多线程爬虫遇到问题求大神指教

老师要求做个爬虫..遇到一些疑惑求大神们指教,感激不尽有100,000个pdf下载地址的txt,从txt里取地址,然后多线程将pdf下载到本地电脑上 下载方法的主代码: package cra...

C++多线程,消息队列用法

  • 2015年12月03日 11:22
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:蒙特卡洛法多线程求圆周率
举报原因:
原因补充:

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