通过编程计算一个游戏的胜率

以前庙会上经常有一个这样的游戏:

摆摊人拿出四种不同颜色的球,每种5个,然后放在一个袋子里,让观众摸出十个来,然后按颜色分类,统计每种颜色的个数,根据不同组合可以拿到不同的奖品,但如果是1234或3322这两种组合的时候,则需要给摆摊人几块钱。

其实一看到这个游戏就大致猜到这是个概率游戏了,1234和3322绝对是该规则下出现的较大的两个概率,摆摊人则无需使用任何作弊手段。但这两种组合的概率是多大,到一直没有细考虑过。其实上学的时候尝试算过,但当时数学没学好,愣是没算出来,便很快放弃了,现在上几年班后就自然更算不出来了。今天编了个小程序简单的算了个粗略的结果:

程序如下:

 1      class Program
 2     {
 3          static  void Main( string[] args)
 4         {
 5              var query =  from i  in Enumerable.Range( 0100 *  10000)
 6                         let result = Test()
 7                         group result by result into g
 8                         let value =  new { Result = g.Key.ToString( " 0000 "), Count = ( double)g.Count() /  10000 }
 9                          orderby value.Count descending
10                          select value;
11 
12              foreach ( var item  in query)
13             {
14                 Console.WriteLine(item);
15             }
16         }
17 
18          static Random rnd =  new Random();
19          static  int Test()
20         {
21              var numbers = Enumerable.Range( 020).OrderBy(_ => rnd.Next()).Take( 10);     // 随机抽取十个
22 
23              var query =  from n  in numbers         // 统计每种花色的张数
24                          let color = n %  4
25                         let value = n /  4
26                         group value by color into g
27                          select g.Count();
28 
29              return query.OrderBy(i => i).Aggregate( 0, (value, i) => value *  10 + i);
30         }
31     }

该程序的输出结果如下:

 { Result = 2233, Count = 32.5512 }
 { Result = 1234, Count = 32.4215 }
 { Result = 1333, Count = 10.8416 }
 { Result = 2224, Count = 10.766 }
 { Result = 1225, Count = 3.2447 }
 { Result = 0334, Count = 3.2204 }
 { Result = 1144, Count = 2.0338 }
 { Result = 0244, Count = 1.6388 }
 { Result = 1135, Count = 1.6385 }
 { Result = 0235, Count = 1.3121 }
 { Result = 0145, Count = 0.3284 }
 { Result = 0055, Count = 0.003 }

也就是说,3322和1234这两种组合将近占了65%,只要摆摊人把1333和2224这两种组合设置为比较小的奖项,基本上就稳赚不赔了,而最大奖0055,只有0.003%的概率,确实很难一见。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值