契机:在日常的网上冲浪时,遇到了一个数学问题。便分享给了舍友一块讨论这个问题。
具体的图片时这样的
有四只鸭子在泳池上随机分布。不考虑鸭子的群居行为等。询问四只鸭子在同一个半圆的概率时多少。其中这个半圆是不固定的。根据鸭子的分布来决定。
其中我们可以把鸭子视为四个点随机分布在半圆中。因为是在半圆的概率,我们可以将鸭子所在的点投影到圆形的边长上。四只鸭子便会在从四个圆表面的点。投影到圆的周长上。他们的概率是相同的。
然后此时,只要从圆上的第一支鸭子从左或者右边连线到最后一只鸭子的距离就是他们在是否同一个半圆的概率。
然后在把四个点的所在的周长拉长成一条直线。其中分布的直线位置也可以判断出来
方法的可行性解释
-
几何转换:
- 将圆周上的点投影到一条直线上,实际上是将圆周上的点的相对位置映射到了直线上。这种映射保持了点之间的相对顺序和距离比例,因此不会改变它们是否在同一半圆内的几何关系。
-
概率等价:
- 在单位圆周上随机选取四个点,与在单位长度的线段上随机选取四个点,在概率上是等价的。这是因为圆周上的均匀分布可以转换为线段上的均匀分布,而不改变点之间的相对位置关系。
-
数学证明:
- 从数学上讲,圆周上的点可以通过弧度制)来表示在直线上的位置。因此,从数学的角度来看,这种转换是合理的。被参数化为角度,而角度可以被线性化(例如,
import java.util.Arrays;
import java.util.Random;
/**
* 计算四只鸭子随机分布在泳池中,落在同一个半圆的概率。
*/
public class TestPro {
public static void main(String[] args) {
// 将实验次数设为1000000
int experimentNum = 1000000;
int duckNum = 4; // 假设有四只鸭子
int successNum = 0;
for (int i = 0; i < experimentNum; i++) {
if (simulation(duckNum)) {
successNum++;
}
}
// 计算成功率
double successRate = (double) successNum / experimentNum;
System.out.println("成功率:" + successRate);
}
/**
* 模拟四只鸭子随机落在单位圆周长上。
*
* @param duckNum 鸭子的数量
* @return 如果四只鸭子落在同一个半圆内返回true,否则返回false。
*/
public static boolean simulation(int duckNum) {
// 假设泳池的单位长度
double unitLength = 1;
// 假设有四个点,分别为A、B、C、D
double[] fourPoints = new double[duckNum];
Random random = new Random();
for (int i = 0; i < duckNum; i++) {
fourPoints[i] = random.nextDouble();
}
Arrays.sort(fourPoints);
// 计算相邻点之间的距离
double[] distance = new double[duckNum];
for (int i = 0; i < duckNum - 1; i++) {
distance[i] = Math.abs(fourPoints[i + 1] - fourPoints[i]);
}
// 计算最后一个点和第一个点之间的距离
distance[duckNum - 1] = 1 - fourPoints[duckNum - 1] + fourPoints[0];
// 检查是否有任何一个距离大于半圆周长
for (double v : distance) {
if (v > unitLength / 2) {
return false; // 如果有距离大于半圆周长,则不在同一个半圆内
}
}
return true; // 所有距离都小于半圆周长,四只鸭子在同一个半圆内
}
}
结果分析
通过运行上述代码,我们可以计算出在1000000次模拟中,四只鸭子落在同一个半圆内的次数,从而得出落在同一个半圆的概率。这个概率可以帮助我们理解随机分布的鸭子在泳池中的分布特性。
但是终究是通过统计运算结果获得的结论。没有数学公式作为依据。只能当作辅助论据。