2017年0304 內推阿里實習——編程測試,積分求概率


題目:

給出心形函數(x*x + y*y - 1)^2 - x*x*y*y  = 0

然后問一個點(X,Y) X服從正態分布(u_x,sigma_x),Y服從正態分布(u_y, sigma_y)

求點(X,Y) 落在心形函數內部的概率。

 

PS: 公式不會推,強行蒙特卡羅法騙20%。。。

 

%20code

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <limits>
#include <stdio.h>
using namespace std;

bool is_in_love(double x, double y) {
    //new_idea
    if (x*y > 0) {
        return x*x + y*y - 1 - x*y < 0;
    } else {
        return x*x + y*y - 1 + x*y < 0;
    }
    //return (x*x + y*y -1)*(x*x + y*y - 1) - x*x*y*y < 0;//old_idea
}

/** 請完成下面這個函數,實現題目要求的功能 **/
/** 當然,你也可以不按照這個模板來作答,完全按照自己的想法來 ^-^  **/
double leartCurve(double mu1, double sigma1, double mu2, double sigma2) {
    int MAX_T = 1000000;
    double get_time = 0;
    int cnt = 0;
    default_random_engine e; //引擎
    while (cnt < MAX_T) {
        normal_distribution<double> nx(mu1, sigma1); //均值, 方
        double x = nx(e);
        normal_distribution<double> ny(mu2, sigma2);
        double y = ny(e);
        if (is_in_love(x,y)) {
            get_time++;
        }
    }
    return (get_time/MAX_T);
}

int main() {
    double res;
    
    double _mu1;
    cin >> _mu1;
    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
    
    double _sigma1;
    cin >> _sigma1;
    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
    
    double _mu2;
    cin >> _mu2;
    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
    
    double _sigma2;
    cin >> _sigma2;
    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
    
    
    res = leartCurve(_mu1, _sigma1, _mu2, _sigma2);
    printf("%.1lf\n", res);
    
    return 0;
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM