之前帮朋友算密码备选,卡在3个数字有多少种组合这个问题上,一开始直接随便估算,算出来的数完全不对,反复核对了好几遍才分清两种完全不一样的情况,很多人都会在这里混淆。

只看不重复的情况,三个位置,每个数字只用一次。第一位可以从0到9挑十个数字,选完一个,第二位就只剩九个可选,第三位缩减到八个,相乘算出来就是720种。那会儿我下意识把0排除在外,以为第一位不能放0,结果直接少算了一大半,朋友拿这个去做密码备选清单,少了上百个组合,核对的时候才发现这个低级失误。

允许数字重复就完全不一样了。

每一个位置都不受前面选择的限制,第一位十个选择,第二位依旧十个,第三位还是十个,10乘10乘10,得到1000种。就像简单的三位密码锁,同一个数字可以反复出现,000、111、222这类都算有效组合,这也是很多人最常接触到的场景。当时试密码的时候,一直默认数字不能重复,漏掉了大量重复数字的组合,白白浪费了不少时间。

还有另外一种很容易混在一起的情形,不看顺序,只看选出哪三个数字,不排列位置。比如选1、2、3,不管写成123还是321,都算作同一种组合。这种算法就不用考虑位置顺序,十个数字里面挑三个不重复的,算出来是120种。最开始没分清排列和组合的差别,把排列的结果直接拿来当组合数,越算越乱,一会720一会120,来回绕了很久。

朋友本来打算用这个结果整理简易密码表,他想要的是密码锁那种,位置有区分,数字可以重复,对应1000种。我一开始拿了不重复排列的720给他,还解释半天,等他去对照锁体说明,才发现我们两个人对题目的理解根本不是一回事。同样一句问法,有没有顺序要求、允不允许数字重复,答案差得很远,不提前说清前提,算出来的数字没有参考意义。

后来再碰到类似的问题,先确认两条前提。第一,数字位置是否区分,换顺序算不算新组合;第二,能不能重复使用同一个数字。这两点定下来,再动手计算,就不会再出现之前算错的情况。

当时草稿纸上写满了好几行算式,涂改痕迹一堆,一会儿划掉720,一会儿圈出1000,到最后才理清楚,单纯问3个数字有多少种组合,本身是一句不完整的提问,缺少限定条件,不同限定,结果完全不同。

那张草稿纸就扔在书桌角落,一直没收拾。