再来一个面试题

哎~ 情况继续恶化,电视台都来了~~~,原本一个运作正常的公司,突然就不行了。。。真是神马都是浮云。

继续来个面试题,倒是也不怎么无聊,就是不知道有啥用,不过做做题,心里还平静点。

 

话说题目是,用随机算法求PI,就是圆周那个PI。随机算法神马的从来都是用过,没写过,这里随便贴个线性同余法

    其中b >= 0,c >= 0,d <= m。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数,另外应取gcd(m, b) = 1,因此可取b为一素数。

 

理论的东西,不折腾了,老实说我也不会,这里直接用c库里的rand,种子也不初期化了。

image

原理是很简单了,以圆心为原点,往上面扔随机点,如果随机点的个数足够多,无疑圆心内的点数除以总点数 = (PI * pow(r,2)) / (4 * pow(r,2)) = PI / 4 。所以当n足够大时,k与n之比就逼近这一概率。从而,PI 约等于 (4*k)/n。看实现:

double get_rand_num() {
    //以圆心作为原点,随机点的x轴,y轴的坐标
    return rand() / RAND_MAX;
} 

double get_pi(long num = 200000000) {
    int k = 0;
    for (int i=0; i<num; i++) {
        double x = get_rand_num();
        double y = get_rand_num();
        if ((x*x + y*y) < 1.0) {
            k++;
        }
    }
    return (double)4*k / (double)num;
}

不过么,结果的精确度实在是不咋的,我的机器上跑出来3.9几,可能是计算中的误差问题,也肯能是点数不够大,。。。就这样吧。

posted @ 2011-01-04 14:49  hjtc  Views(497)  Comments(0Edit  收藏  举报