逛b站看到一个数学题用java模拟,结果和答案不一样.到底是我想错了还是答案错了还是代码错了.

原视频地址 【官方双语】如何优雅地解答最难数学竞赛的压轴题?_哔哩哔哩_bilibili 一道困难的几何谜题,一个精妙的解答方法。更多信息请看下方评论翻译:Solara570、蛋卷 校对:ZSC、YinghuiX 时间轴 后期:Solara570The hardest problem on the hardest testhttps://youtu.be/OkmNXy7er84 https://b23.tv/gpYYlX
这问题是在一个球的面上随机取4个点,形成的4面体过球心的概率是多少。
视频中up先用圆来类推了,先在圆上取3个点,研究形成的三角形过圆心的概率,分析出来概率是0.25,我一开始用C++写了圆的模拟,答案接近0.275,以为C++的rand随机性太差,于是移植到JAVA,结果还是接近0.275.
然后我就猜,可能是up忽略了两点构成直线过原点时概率为1产生的误差,但是这题不止他一个人做,又是道老题,始终不敢定论.

代码:
首先是point类的随机数用的是0到1的double类型,试过int类型的,结果几乎一样。

import java.util.Random;

public class point {
    static Random r1 = new Random();
    public double x, y;
    point(){
        x = r1.nextDouble();
        y = r1.nextDouble();
    }
}

主函数是以 是否形成锐角或直角三角形 来判断三角形是否过圆心,这个应该没问题吧

import java.util.Arrays;

public class problem {
    public static void main(String[] args) {
        int count = 0;
        int times = 10000000;
        for (int i = 0; i < times; ++i) {
            point a = new point();
            point b = new point();
            point c = new point();
            //两条短边的平方和大于等于长边的平方时为直角或锐角三角形
            double lab2 = Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2);
            double lac2 = Math.pow(a.x - c.x, 2) + Math.pow(a.y - c.y, 2);
            double lbc2 = Math.pow(c.x - b.x, 2) + Math.pow(c.y - b.y, 2);
            double[] l = {lab2, lac2, lbc2};
            Arrays.sort(l);
            if (l[0] + l[1] >= l[2])
                count++;
        }
        System.out.println(count + "/" + times + "=" + count * 1.0 / times);
    }
}

你的问题在于你的point类无法保证你的点在圆上面啊。你这么写的随机0-1就变成边长为1的正方形内随机选取一个点了

球面的话很好理解的,首先随便确定一个点,然后过球心画3条直线,球面将三条直线分成3个线段,相交于6个端点,在每条线段上面取一个端点组成剩下的3个点,与一开始确定的一个点组成4面体就是过球心的4面体。那么问题来了,使用抛硬币的方法在三条线段分别取一个端点的概率是多少?
抛3次在3条线段端点中分别取一个点,1/2*1/2*1/2=1/8

又看到大于一条的直线共线的概率极限为0的说法,我的猜想就又不成立

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632