随机在圆上生成n个点,这n个点在同一半圆的概率是多少?

We randomly distribute n points on the circumference of a circle. What is the probability that they will all fall in a common semi-circle?

我们先用程序模拟一下这个过程,看看结果会是什么?


算法思想我们先定义一个点的最大值,然后随机生成N个点,之后对这N个点进行排序,定义两点之间的最大距离为max_distance,把它的初始值设置为最小值点+最大值-最大值点,然后遍历所有点,求的相邻两点之间的最大值,如果max_distance大于半圆周长,说明这些点在同一半圆内。


代码清单:

import java.util.Arrays;
import java.util.Random;


public class Npoints {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int m = 10000;
		int count;
		Npoints robot = new Npoints();
		for(int n = 1; n <= 8; n++){//一共测试n个点
			count = 0;
		for(int i = 0; i < m; i++){//每个点做m次测试
			if(robot.judge(n) == true){
				count++;
			}
		}
		System.out.println("n=" + n + "时,在同一半圆的概率为:" + count*1.0/m);
		}
	}

	private boolean judge(int n) {
		
		
		int points = 10000;//点的最大值
		int half = points >> 1;
		Random r = new Random();
		int[] array = new int[n+1];
		for(int i = 1; i <= n; i++)
			array[i] = r.nextInt(points) + 1;
		Arrays.sort(array);
		int max_distance = array[1] + points - array[n];

		for(int i = 1; i < n; i++){
			if(array[i+1] - array[i] > max_distance)
				max_distance = array[i+1] - array[i];
		}

		return max_distance >= half;
	}

}

输出:

n=1时,在同一半圆的概率为:1.0
n=2时,在同一半圆的概率为:1.0
n=3时,在同一半圆的概率为:0.7517
n=4时,在同一半圆的概率为:0.4955
n=5时,在同一半圆的概率为:0.3131
n=6时,在同一半圆的概率为:0.1919
n=7时,在同一半圆的概率为:0.1095
n=8时,在同一半圆的概率为:0.0601


通过上面的模拟结果,可以看出随着n的增大,概率呈指数递减,并且通过P(1)=P(2)=1,猜测出它的结果可能为

n / 2^(n-1),通过多次验证,验证了这个结果的正确性。之后我花了一下午的时间试图对这个问题进行数学证明,不过很遗憾,几次尝试都是错误的解释或证明。


最后查到了原题作者对此问题的数学证明,见识下作者强悍的数学功力。




在求解的过程中,我还发现了一个有趣的现象:对n个点排序后,如果认为最大值点-最小值点 < 半圆周长 的话,那么它的结果将是第n+1个点的概率。


==================================================================================================

  作者:nash_  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/nash_/article/details/8547278

===================================================================================================

猜你喜欢

转载自blog.csdn.net/nash_/article/details/8547278