zoukankan      html  css  js  c++  java
  • 今天你玩24点了吗?

    24点的规则十分简单:                                    

    从52张牌里面随便抽4张,经过加减乘除和括号进行运算,得到24点即为胜利。

    数学化后就是:

    有1、2、3……13 共13组,可重复抽样,抽取4次,得到的4个数进行加减乘除和括号组合的运算,结果要求是24。

    简单的:

    比如 1 2 3 4显然 1* 2 *3*4为24,而1 1 1 1 显然最大只能产生4而无法产生24……

    那么给4个数字之后除了乱试之外,有没有一些方法可以保证你可以断言它有没有解呢? 很容易,暴力遍历。

    一、对于两个数a,b:

         产生的可能的运算结果一定包含于下面的集合中:{  a+b,a-b,b-a,a*b,a/b(b不为0),b/a(a不为0) },这个十分容易,小学生也可以轻易的想出来。记作R(ab)

    二、 那么继续,三个数a,b,c的运算结果有哪些呢? 

         对于abc的全排列的每一种,先求出前两个数的可能结果集合B,c和集合B中每一个元素再进行前面的计算,最后得到集合C 

          将abc全排列的每一种计算出的C并起来就可以得到所有可能的结果了。

    简单来说,就是 R(abc)=R ( R(ab) c)

    三、 对于四个数:

         R(abcd)=R(R(ab)R(cd)) ∪ R(R(abc)d)

    此时随便输入4个位于1-13的数字,就可以断定它是否可以组成24点,若可以,还可以告诉我们是如何算出的,如果不可以,则会提示no 。

    当然其实还有其它的方法来做这件事情,但没有上面的直接,比如可以使用后缀表达式来表示计算式,这样就不用关注括号的问题了,比如三个数字abc的结果:a b c op op, b c op a op两种结构,当然对于abc的全排列的每一种都会产生对应的结果。

    更有趣的是,如果遍历所有可能的情况就可以得到所有可以实现24点的情况,那么所有可能的情况是什么呢?上面已经提到了是一个可重复抽样,那么计算公式就是C(n-m+1,m),具体而言就是

             for(i from 1 to 13)

                      for (j from i to 13)

                               for( p from j to 13)

                                         for(q from p to 13)

                                                   generate [i j p q]

    最后得到的ijpq就是一次符合条件的抽样了。

    随便举个例子,输入4 7 9 12 会告诉你解法是9+12-(4-7)~

    image

    最后发现,24点的所有可能抽样1820种中,有1362中都可以组成24点!概率为74.83%

             24 的因子很多:2 4 6 8 12 ,在超过20的数中,组成24点的可能数是最大的!所以24点游戏才比较多样好玩~

             20点以下有一些数字的成功概率比24点还要大,最极端的:2点的成功率高达96%,也就是说,如果玩2点的话,抽到的4张牌基本上都可以组成2点,所以凑不出来的话基本上是你自己的问题啦。当然2太小了,说不去不够气魄,而且2的因子比较少,凑成2 的方法比较少,基本上就是通过1+1,1*2,2/1或者a-(a-2)等方法来凑,感觉比较容易试出来。

    最后附一章图片:纵坐标为成功概率(可以凑出该点数的种类数/所有可能抽到牌的种类数),横纵标为对应的点数(从0到100)

    容易发现24是20之后最高的点,并且36、48、60、72也是比较高的峰值,因为他们的因子都比较多,但为何它们的种类数没有24点高呢?因为这些数比较大,用4个1-13的数值来凑的话反而导致没有24点多,但如果采用比如更多张的牌(比如两幅扑克),72、60等的成功率应该是更高的。

    image

  • 相关阅读:
    【模仿】一个充满BUG的小程序
    JAVA中的内部类
    oracle删除实例的方法
    牢记每个死循环都要有跳出语句【这个要看】
    删除无效服务的命令
    Oracle触发器和new、old特殊变量
    Python模块之os 系统操作
    Python模块之pyautogui 模拟按下键盘
    Python模块之platform 获取平台信息
    Python官方内置函数V3.10详解
  • 原文地址:https://www.cnblogs.com/gaoduan/p/4143802.html
Copyright © 2011-2022 走看看