已知某事件发生的概率为p,则要让该事件发生所需的试验次数期望值为1/p

 
 
问题来源:

《数据结构与算法分析——Java语言描述》(美)Mark Allen Weiss

第四章的习题 4.14 

理论证明:

已知事件A发生的概率为p,

试验1次,事件A就发生的概率为p,

试验2次,事件A才发生的概率为p·(1-p),

试验3次,事件A才发生的概率为p·(1-p)^2,

...

试验k次,事件A才发生的概率为p·(1-p)^(k-1)。

试验次数的期望

E = sigma(k = 1~无穷大) k·p·(1-p)^(k-1)

记 S = 1 + 2(1-p) + 3(1-p)^2 + ... + k(1-p)^(k-1),

(1-p)S = (1-p) + 2(1-p)^2 + 3(1-p)3 + ... + (k-1)(1-p)^(k-1) + k(1-p)^k,

所以,

pS = 1 + (1-p) + (1-p)^2 + (1-p)^3 + ... + (1-p)^(k-1) - k(1-p)^k,

S = (1-(1-p)^k)/p - k(1-p)^k

当k趋向于无穷大时,S = 1/(p^2),

所以,E = 1/p。


编写程序验证:

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

/**
 * 验证:
 * 如果某事件发生的概率为p,则要让该事件发生所需进行的平均试验次数为1/p。
 * 测试思路:
 * 已经从区间[0,99]随机选取10个数,再从其中选择尚未出现的随机数的概率为p=(100-10)/100=0.9,
 * 若所需要进行的平均试验次数约等于为1/0.9=1.11,则测试成功。 
 */
public class Expectation {
	boolean[] B = new boolean[100];
	Random RND = new Random();
	
	/**
	 * 从区间[0,99]产生一个随机数
	 * @return
	 */
	int rand10() {
		return RND.nextInt(100);
	}
	
	/**
	 * 在[0,99]中随机选取10个不重复的数
	 */
	public Expectation() {
		int count = 10;
		while (count > 0) {
			int rand_num = rand10();
			if (!B[rand_num]) {
				B[rand_num] = true;
				--count;
			}
		}
	}
	
	public void glance() {
		for (int i = 0; i < B.length; ++i) {
			if (B[i]) {
				System.out.println("辛运数字: "+ i);
			}
		}
	}
	
	/**
	 * 从区间[0,99]选择尚未出现的随机数所需要试验的次数
	 * @return
	 */
	public int expected_trials() {
		boolean isFound = false;
		int count = 0;
		while (!isFound) {
			if (!B[rand10()]) {
				isFound = true;
			}
			++count;
		}
		return count;
	}
	
	public static void main(String[] args) {
		Expectation expec =  new Expectation();
		expec.glance();
		int[] trial_count = new int[10000];
		double sum = 0;
		for (int i = 0; i < trial_count.length; ++i) {
			trial_count[i] = expec.expected_trials();
			sum += trial_count[i];
		}
		System.out.println("平均试验次数 = " + sum / 10000);
		Arrays.sort(trial_count);
		for (int i = trial_count.length -1; i >= trial_count.length - 10; --i) {
			System.out.println("top 10: " + trial_count[i]);
		}
	}
}

你可能感兴趣的:(概率,期望,试验次数)