2010-7
23
你可能也对这些感兴趣
点我收起
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的图上来看,区别不大,我还是用自己的随机数好了。
Additional comments powered by BackType

用自己的随机数好
有点儿事想请教一下老友,麻烦有空的时候发个邮件给我.先谢了.
客气了