zoukankan      html  css  js  c++  java
  • 通过编程计算一个游戏的胜率

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

    摆摊人拿出四种不同颜色的球,每种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%的概率,确实很难一见。

  • 相关阅读:
    ASP.NET 无提示关闭窗口
    C# Winform程序获取外网IP地址
    使用System.Drawing.Printing 画报表。
    C# Winform调用IP地址、手机归属和身份证查询接口
    C# 获取文中文字符首字母
    C# WinForm给Button或其它控件添加快捷键响应
    C# 获取农历日期
    TSQL之插入的内容是查询出的值
    C# 获取中文星期的两种方法
    C#批量操作控件
  • 原文地址:https://www.cnblogs.com/TianFang/p/2340684.html
Copyright © 2011-2022 走看看