题目一

竹筒有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        }
两道有趣的面试题

相关文章: