对某里求点落入爱心曲线内概率在线编程题的思考

题目:方程 (x2+y21)3x2y3=0 能画出一个美丽的爱心,现给定一个点(X,Y),其中 XN(μ1,σ21) , YN(μ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));
    }
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值