少女祈祷中...

boost是专业的库,它的random可以生成高质量的随机数。但Monte carlo方法用很伪的随机数即可,要求并不高。暴力的蒙特卡洛算法更看重速度,下面来看看速度对比:

N = 1000000
boost的uniform_int(1,100)需要1864毫秒...

自己的unif_int(1,100)需要241毫秒...

boost的正态分布需要990毫秒...

自己的正态分布需要456毫秒...

代码如下:

#include<ctime>
#include<cmath>
#include<iostream>
#include <boost/random.hpp>
 
#define PI 3.1416
 
using namespace std;
using namespace boost;
 
inline double unif_rand(){  //生成(0,1)的实数均匀分布
	//rand();
	return(rand()+0.5)/(RAND_MAX+1.0);
};
 
inline int unif_int(int a, int b){   //生成a到b-1的整数均匀分布
	return int(floor(a+(b-a)*unif_rand()));
};
 
inline double gaussien(){  //标准正态分布的生成
	return sqrt(-2.0*log(  unif_rand()  ) )*cos(  2.0*PI*unif_rand()  );
};
void main(){
	srand(static_cast<unsigned int>(time(0)));
        rand();//因为第一次的随机值不好,我们不要
	uniform_int<> distribution(1,100);
	mt19937 engine;
	mt19937::result_type random_seed= static_cast<mt19937::result_type>(time(0));
	engine.seed(random_seed);
	engine.seed(static_cast<mt19937::result_type>(random_seed));
	variate_generator<mt19937, uniform_int<> > random_choice (engine, distribution);
	normal_distribution<> normal(0,1);
	variate_generator<mt19937, normal_distribution<> > gaussian(engine,normal);
 
 
	ofstream flux("test.txt");
	//flux.precision(5);
	int N=1000000;
	flux<<"N = "<<N<<endl;
	double start, finish, duration;
	start=clock();
	for(int i=0;i<N;i++){
		random_choice();
	}
	finish=clock();
	duration=(double)(finish-start);
	flux<<"boost的uniform_int(1,100)需要"<<duration<<"毫秒..."<<endl<<endl;
 
	start=clock();
	for(int i=0;i<N;i++){
		unif_int(1,101);
	}
	finish=clock();
	duration=(double)(finish-start);
	flux<<"自己的unif_int(1,100)需要"<<duration<<"毫秒..."<<endl<<endl;
 
	start=clock();
	for(int i=0;i<N;i++){
		gaussian();
	}
	finish=clock();
	duration=(double)(finish-start);
	flux<<"boost的标准正态分布需要"<<duration<<"毫秒..."<<endl<<endl;
 
	start=clock();
	for(int i=0;i<N;i++){
		gaussien();
	}
	finish=clock();
	duration=(double)(finish-start);
	flux<<"自己的标准正态分布需要"<<duration<<"毫秒..."<<endl<<endl;
 
	flux.close ();
}

从plot的图上来看,区别不大,我还是用自己的随机数好了。

: http://www.deuxmille.org/archives/1553

本文相关评论 - 才 3 条评论
2010-07-23 18:29:30

用自己的随机数好

HaHaGood
2010-07-25 04:31:37

有点儿事想请教一下老友,麻烦有空的时候发个邮件给我.先谢了.

2010-07-25 12:08:03

客气了

  • :em14:
  • :em04:
  • :em11:
  • :em32:
  • :em08:
  • :em05:
  • :em17:
  • :em19:
  • :em24:
  • :em00:
  • :em31:
  • :em33:
  • :em06:
  • :em26:
  • :em27:
  • :em03:
  • :em28:
  • :em30:
  • :em13:
  • :em23:
  • :em21:
  • :em16:
  • :em20:
  • :em15:
  • :em07:
  • :em29:
  • :em02:
  • :em12:
  • :em18:
  • :em10:
  • :em01:
  • :em09:
  • :em22:
  • :em25:

Additional comments powered by BackType