题目一
竹筒有20根签,10根白色,10根红色。抽取10根颜色一致可获得100元奖励,抽取9根颜色一致可获得50元奖励,但是抽取红色5根白色5根就损失50元,问这游戏是否值得参与?原因?
解:
这是典型的组合数求期望问题。设事件‘抽取10根颜色一致’为A,事件‘抽取9根颜色一致’为B,事件‘抽取红色5根白色5根‘为C。
根据组合数公式
C(m.n) = m!/(n!*(m-n)!)
求得事件A的概率P(A) = C(10,10)*2/C(20,10) = 0.00001082508822446903 ;
事件B的概率P(B) = C(10,9)*C(10,1)*2/C(20,10) = 0.001082508822446903;
事件C的概率P(C) = C(10,5)*C(10,5)/C(20,10) = 0.34371820130334063;
期望 = P(A)*100 + P(B)*50+P(C)*(-50) = -17.130702115222242;
结论,期望低于0。游戏无数次后,最终会亏损17.13元,该游戏不值得玩。
下面我们使用程序实现该游戏,并且提供求期望的函数。
第一个思考,如何高效求出概率,
第二个思考,如何有效地模拟用户抽签的情况,
第三个思考,如何统计抽签结果呢,
。。。。。
最后想想,万一日后用户需要修改游戏规则呢
完成整个模拟,需要实现四个模块:
第一部分,制定游戏规则和奖励规则
第二部分,计算期待
第三部分,获取一次游戏结果
第四部分,根据奖励规则,统计结果
打代码总是很愉快地,啦啦啦~~~
1 function Probability(){
2
3 //--------------------1,制定规则
4
5 //抽奖箱中的包含的签种类和数量
6 this.typeColor = {
7 'red': 10,
8 'white':10
9 };
10 //抽取数量
11 this.extractNum = 10;
12 //可能性,和收益对应表
13 this.possibility = {
14 '10' : 100,
15 '9' : 50,
16 '5' : -50
17 },
18
19
20 //--------------------2,计算期待
21 this.getExpectation = function(){
22
23 //暂时省略这一部分代码,下面我们一同探讨这一部分代码如何优化
24 return (-17.130702115222242).toFixed(2);
25 };
26 //-------------------3,获取一次游戏结果
27 this.playGame = function(){
28 var _a = [] ;//空抽奖箱,存储所有的球
29 var _r = []; //‘抽奖结果’
30 for( a in this.typeColor){
31 for(var i=0;i<this.typeColor[a];i++){
32 _a.push(a);
33 }
34 }//将签放入抽奖箱
35
36
37 //遍历,开始抽奖,
38 for(var i=0;i<10;i++){
39 //抽取特定一个球
40 var _i = Math.round(Math.random()*(_a.length-1));
41 //将抽出的球,放入‘抽奖结果’中
42 _r.push(_a[_i]);
43 //移除抽奖箱中刚被抽取的球
44 _a.splice(_i,1);
45 }
46 return _r;
47 };
48
49 //-------------------4,统计结果
50 this.getResult = function(arr){
51 //统计各种球的结果
52 var _r = {};
53 for( k in arr){
54 _r[arr[k]]? _r[arr[k]]++:_r[arr[k]] = 1;
55 }
56
57 //统计收益
58 for(p in _r){
59 for(k in this.possibility){
60 if(_r[p] == k){
61 _r.earnings = this.possibility[k];//价格
62 }
63 }
64 }
65 return _r;
66 }
67 }