以前庙会上经常有一个这样的游戏:
摆摊人拿出四种不同颜色的球,每种5个,然后放在一个袋子里,让观众摸出十个来,然后按颜色分类,统计每种颜色的个数,根据不同组合可以拿到不同的奖品,但如果是1234或3322这两种组合的时候,则需要给摆摊人几块钱。
其实一看到这个游戏就大致猜到这是个概率游戏了,1234和3322绝对是该规则下出现的较大的两个概率,摆摊人则无需使用任何作弊手段。但这两种组合的概率是多大,到一直没有细考虑过。其实上学的时候尝试算过,但当时数学没学好,愣是没算出来,便很快放弃了,现在上几年班后就自然更算不出来了。今天编了个小程序简单的算了个粗略的结果:
程序如下:
1 class Program 2 { 3 static void Main( string[] args) 4 { 5 var query = from i in Enumerable.Range( 0, 100 * 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( 0, 20).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%的概率,确实很难一见。