【第22期】观点:IT 行业加班,到底有没有价值?

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

原创 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中实现其中基于蒙特...

java多线程中synchronized关键字的用法

由于同一进程内的多个线程共享内存空间,在Java中,就是共享实例,当多个线程试图同时修改某个实例的内容时,就会造成冲突,因此,线程必须实现共享互斥,使多线程同步。 最简单的同步是将一个方法标记为synchronized,对同一个实例来说,任一时刻只能有一个synchronized方法在执行。当一个方法正在执行某个synchronized方法时,其他线程如果想要执行这个实例的任意一个synchronized方法,都必须等待当前执行 synchronized方法的线程退出此方法后,才能依次执行。 但是,非synchronized方法不受影响,不管当

求 素数的几种算法(位图法,多线程)

据说某公司面试,问了10几个人竟然没人会求1-100间的素数   下面我们举例 写个从1到1000w之间素数的算法   最朴素的算法 package Algorithm.DP; pub...

平衡树法求前缀和--内容讲解及多线程实现源码

平衡树求和法是一个适用于并行处理的算法,它的定义如下: 下面具体给出在SIMD并行机上的视线算法,如下: <img alt="" src="http://p.bl

Linux下多线程通过蒙特卡洛法来求取pi值

特卡洛法又称随机抽样技术 是一种应用随机数进行仿真试验的方法。 用该方法计算π的基本思路是:  根据圆面积的公式: s=πR2 ,当R=1时,S=π。  由于圆的方程是:x2+y2=1(X2为...
  • niuox
  • niuox
  • 2013-01-16 11:09
  • 2509
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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