您的位置:首页 > 其它

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

2013-02-03 15:44 204 查看


问题来源:
《数据结构与算法分析——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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  期望 概率 试验次数