今天你玩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)~
最后发现,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等的成功率应该是更高的。