题目:方程 (x2+y2−1)3−x2y3=0 能画出一个美丽的爱心,现给定一个点(X,Y),其中 X∼N(μ1,σ21) , Y∼N(μ2,σ22) ,求该点在爱心曲线内的概率是多少?
很尴尬,这个题自己在做在线编程的时候没有做出来,刚看到题的时候就知道会用随机数来求解,但是思路不对,一直在考虑应该要用到 μ±3σ 的条件吧。下来后思考了一下,觉得问题应该这样考虑才是正确的,具体思路如下:
既然曲线方程已知,我们利用随机数随机出符合给定正态分布的点,然后把点代入方程判断是否小于等于0 ,若满足则表明点在曲线内。由于是随机化的近似算法,我们应重复n次统计满足条件的次数来计算概率。
具体代码如下:
package onLineProgram;
import java.util.*;
public class Main {
/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
static double leartCurve(double mu1, double sigma1, double mu2, double sigma2) {
//n为模拟次数
int n = 10000;
int count = 0;
int i = n;
Random random = new Random();
while(i-- > 0){
double x = getGaussValue(random.nextGaussian(), mu1, sigma1);
double y = getGaussValue(random.nextGaussian(), mu2, sigma2);
if(calValue(x, y)){
count++;
}
}
return (double)count / n;
}
/**
* 将变量从一个正态分布(0,1)转换到服从另一正态分布(mu2,sigma2)
* @param val
* @param mu
* @param sigma
* @return
*/
static double getGaussValue(double val, double mu, double sigma){
return mu + sigma * val;
}
/**
* 根据x与y值代入爱心方程,判断该值是否在爱心里面
* @param xval
* @return
*/
static boolean calValue(double x,double y){
double x2 = x * x;
double y2 = y * y;
double z = x2 + y2 -1;
return z * z * z - x2 * y2 * y > 0 ? false:true;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
double res;
double _mu1;
_mu1 = Double.parseDouble(in.nextLine().trim());
double _sigma1;
_sigma1 = Double.parseDouble(in.nextLine().trim());
double _mu2;
_mu2 = Double.parseDouble(in.nextLine().trim());
double _sigma2;
_sigma2 = Double.parseDouble(in.nextLine().trim());
res = leartCurve(_mu1, _sigma1, _mu2, _sigma2);
System.out.println(String.valueOf(res));
}
}