原视频地址
【官方双语】如何优雅地解答最难数学竞赛的压轴题?_哔哩哔哩_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);
}
}