如果你不了解猜数字,可以来这里玩玩。简单归纳一下就是,4个位置,放0-9,互不相同。你可以一次次地猜测是哪四个数字,直到猜对为止。每次猜测,都会得到一个结果,形如XAXB,比如0A1B。A代表你的猜测中有一个数字的位置跟答案中相同,B代表有一个数字答案中有,但你猜得位置不对。

最早玩这个是在文曲星上,当时觉得这个游戏简直难得一逼,跟文曲星上别的游戏简直不是一个数量级(更重要的原因是错误提示画面非常之恐怖)。但最近觉得这个游戏没有道理这么难,遂决定琢磨一下算法。

首先从信息论的角度分析一下,题目相当于说从P(10,4)个可能性中找出那唯一的一个,也就是说,必须拿到log(P(10,4))这么多信息量。这是多少呢?我们算一下大概就是12.3bit(原来只有这么点。。。),也就是说,如果每次砍掉一半,那么砍13次就能找到这个组合了。据说正常人平均7次能猜出一道猜数字的答案,文曲星上的期限是10次以内(反正我是经常猜不出来……),我们就按10次来算,这意味着每次XAXB的结果能给我们带来1bit以上,2bit未满的信息。

4A0B的可能性是多少?1/P(10,4) = 1/10*9*8*7。3A0B呢?4个空可以换,每个空还有10-4=6个选择,也就是24/P(10,4)  ——是的,请注意不存在3A1B……。2A时b的情况就多了,我刚才在这里列了几个式子,发现很不简洁,于是作罢。0A0B呢?P(6,4)/P(10,4)=6*5*4*3/10*9*8*7,是4A的360倍,多得一塌糊涂。容易发现,由于位置数比可能性的总数要小得多,想得到一个A或者B更高的结果,概率是相当低的。换句话说得到结果越准确,得到的信息量就越大。

OK。那么我们初始化时构造一个可能性集合,每次给出一个尽量准确的结果,然后在每次猜测后根据得到的结果,将不匹配的可能性剔除,如此进行直至得出结果。这个“尽量准确”难倒了我,于是我的第一个实现就只是给出集合中的第一个解,近似于随机给出——STL的set是用红黑树实现的。

没想到的是,这样实现的结果已经足够好……随机生成10000个谜题,平均解题所需要尝试的次数在5.4841。这也就意味着,平均每次猜测可以提供超过2bit的信息量。要知道A的取值不过是0 1 2 3 4而B更仅仅是从0到4-A而已,这两个数字就是完全随机也不过能提供4bit不到的信息量。这个效率好得实在超出想象(求哪位给一个数学上清晰的解释)。

那么我对“尽量准确”能带来的改善就不抱太大希望了。我用的方法是统计每次现存的可能性集合中每个位置上每个数字的出现概率(其实用出现次数即可,反正都是成正比的),对于每一个可能性,四个位置上的数字概率之积最大的,就是“尽量准确”的。测试的结果,平均改善0.05次尝试。

我改测试5个位置填0-9,也是差不多0.05次的改善。

位置数继续增长时,第一次构造集合的尺寸就指数增长,可能性数增长时,就幂函数增长,都不是善茬。试了几次太慢,我也就懒得测试了……

代码共享在: https://github.com/duduzhu/Guess

老实说,这还真是挺丢脸一个作品,我觉得也就是个数据结构小作业的水平,连大作业都算不上。

不过,真上数据结构的时候,我在用网页实现猜数字……不是策略……而是猜数字本身……弱智到要命。而且因为对网页UI畅想太好,到底没弄好。

丢人。

我曾经毫不动摇地以为这是个贬义词。

直到我看天龙八部,看到丁春秋笑话苏星河沉迷棋艺,玩物丧志时,才突然觉得不对。

醉心武艺就是不玩物丧志?武功算个什么志?哼哼哈兮?

反倒是围棋,四艺之一,由古及今,何尝受了冷落去?

自此我便觉得,没什么物、志之分,更无玩物丧志。

你玩什么,什么便是你的志。

爱好就是爱好,没什么“业余”爱好。

理性上,我是不相信2012世界末日的。那都是不科学的人才相信的,我很不屑。

但某些瞬间会想一下,如果是真的,那我要干点什么?有什么遗憾?

每每这个念头刚出现,另一个声音就会自嘲地说,别想了,反正都是假的。

针锋相对一半,原本的声音会问,为什么?

“这要从宇宙的起源讲起……”

“那就是说宇宙还是会毁灭的喽?”

“唔……是的”

死一般的寂寞……

“不过也不用担心,因为远在那之前,你就肯定会死掉了。”

死一般的寂寞……

 

这就是为什么我最痛恨物理。因为这破学科最尖端的进展无时无刻不像一个恶魔,在你身边挥舞他的小钢叉“你是会死的哦~你是会死的哦~”。

我觉得这才是顶尖物理学家往往都不会像我想象的那样是无神论者的原因吧。

不然他们的内心世界得多么坚强……

人类的协作分工天然有抽取、重构、统一化的趋势,我认为手机的SIM卡会逐渐被抽象成安装在智能手机中的一个App。

SIM, subsvriber identification module.

本意就在于对用户进行鉴权。

之所以将其做成独立的硬件小模块,是为了将subscriber的身份认证与终端解绑定,使得终端可以在运营商之间迁徙。

然而总有不守规矩的家伙,Apple Inc。

它把原本统一的SIM卡百般揉捏,搞出了MINI卡,NANO卡等种种外形与标准不兼容但工作依旧正常的SIM卡。由于iPhone要命的市场占有率,各大运营商纷纷在舔它的屁股。

那么,几番折腾下来,难免有运营商被提醒:SIM最要命的,只是其中的鉴权数据而已。手机泛智能化的今天,别说容量一般只有100k的SIM鉴权数据,就是再翻10倍100倍也可以轻松搞定。为什么没搞呢?

如果你尝试读过Android的源码,你会发现,该死的手机操作系统,分为OS部分和基带部分。

基带是什么意思?如果你不是通信出身,可能不了解。不过没关系,这里用这个词也是错的。你只要知道:

智能机的软件部分并不处理SIM的信息,那部分是基带部分——也就是俗称的芯片,来处理的。

So what?

也就是说你的手机从开机,找信号,读SIM的信息送到网络进行鉴权认证,返回正确的结果……这一串过程,智能机和非智能机没什么区别。

是的,没什么区别,在这部分功能上,智能机——至少目前的智能机——并没有更智能。

至于原因,很简单,因为他们都是买别人的芯片啊……

手机就像电脑,而让它能打电话的,只是像电脑上的电视卡似的一个外设而已,就是如此。

 

但这绝不是不可逾越的障碍。

芯片厂商之所以把SIM自己处理掉了,是因为大部分的终端商都没打算自己做,这么卖准没错。

但大部分不做不代表少部分不能做,特别是少部分发货量特别猛的奇葩,特别是没事总爱欺凌SIM卡的Apple Inc.

我畅想着哪一天Apple要求供货商把处理SIM的模块扔掉,交给上层应用来做。Apple随即把这事儿开发成一个App。

以后你要是买iPhone,都不需要什么卡,只要到营业厅去要一个激活码,打开手机,打开SIM这个App,输入,激活。

好了,可以入网了。

iSIM。

这个点子如何?