APP下载

信息熵的直观体验

2018-10-16陈凯

中国信息技术教育 2018年19期
关键词:字符串信息熵字符

陈凯

胡乱打字通关游戏

一些信息技术教材在提到“信息”的概念时,会引用香農的观点:“信息是能够用来消除不确定性的东西。”这里的“不确定性”其实指的是随机不确定性。为什么所谓的信息和随机不确定性有关呢?这个问题可不简单,并不是三言两语就能够说明白的。为了对所谓的随机不确定性有直观的感受,不妨先来看一个简单的通关游戏。游戏是用Python语言写的,运行界面如图1所示。

游戏提示说,输入合适的口令,才能通关到下一步,可是口令是什么呢?这时候只有随便敲打键盘看自己运气了。唯一的要求是输入的字符数量要多于50个。至于输入的字符是什么,输入的字符顺序怎样,输入的字符是否重复,这些都无所谓。然而,也许玩家无论怎样输入字符,都无法过关,如图2所示。

再来一次,可还是不行,如图3所示。

然而,笔者“随便”敲打输入一大串字符,就奇迹般地过关了,如图4所示。

多试几次,结果也是这样。笔者输入的字符看似完全没有规律,但每次都能顺利过关。实际上,这些字符确实是胡乱敲打输入的,但在敲打输入时,有一个非常隐蔽的诀窍。仔细观察,我们可以发现,输入字符后代码会反馈一串带小数点的数字。玩家前两次输入后,得到的数字大约是3.14和2.42,但笔者输入字符后,这串数字是3.07。在Python程序代码中,存在着一句判断语句,当这个数字大于2.95、小于3.1的时候,就能完成游戏通关。为了便于玩家通关,代码里将数字显示在了屏幕上,如果不显示这个数字,要通关就更困难了。

这个数字究竟是怎么来的呢?它代表的就是根据玩家所输入的一大串字符所计算出来的随机不确定性。数字越大,随机不确定性也就越大,数字越小,随机不确定性也就越小。为了能够通关,我们就必须把握好所输入的字符的随机不确定性。可是,怎么把握输入字符的随机不确定性呢?再一次观察笔者输入的字符,可以发现总共有十种不同的字母,其中九种字符出现的概率大致是相同的,而字符“g”出现的概率远小于其他字符。当然,出现概率被降低的字母不一定是“g”,再一次玩游戏时,也可以降低其他字母的概率,若是不公开说明,旁人是很难发现其中蹊跷的。那么,输入的每一串字符的随机不确定性是怎么计算出来的呢,且看完整的Python代码,如图5所示。

代码中用到了Counter类,它的作用是跟踪每个字符出现的次数,lns变量存储的是整个字符串的长度,count是某个字符在整个字符串中总共出现的次数。代码中最关键的一段数学公式,就是count/ lns*math.log(lns/count,2)。这段公式到底起什么作用呢?我们可以通过输入不同的字符来试试看。例如,输入字符串aaaa,则count为4,lns也是4,count除以lns,或lns除以count,都得到1,然后,对于数字1,取以2为底的对数,这其实就是问2的几次方是1,结果是0。代码中for循环结构所做的工作,是对出现的不同的字符进行上述运算后,再将结果累加起来,不过因为字符串aaaa只有一种字母,所以等于没有做加法,结果自然还是0。数字0意味着玩家输入的字符串中的每个字母非常有规律,随机不确定性低到了极点。

如果输入的是字符串aabb,则对于第一种字母a,count为2,lns为4,count除以lns得到0.5,lns除以count就得到2,然后,对于数字2,取以2为底的对数,这其实就是问2的几次方是2,结果是1。最后,循环语句实际执行的操作就是0.5*1+0.5*1,结果为1。这就能看出,字符串aabb与字符串aaaa相比,输入的每个字母的随机不确定性要高一些。

凑数通关法及其背后的深意

假设事先知道,当输入字符串的随机不确定性值在2.95和3.1之间就能通关。那么,怎么用一堆貌似胡乱输入的字符串凑出3.0这个数字呢?最简单的办法就是先凑出3/8,然后将3/8算上它自己累加8次,凑数时需要一些逆向的思维:

3/24代表什么呢?其实就是说,如果输入的字符串长度是24,那么每个字符需要出现3次。不过根据刚才游戏的要求,规定玩家输入的字符数量要多于50,那么只要分子分母各乘以3就可以了,也就是说,输入72个字符,每个字符出现9次,这就意味着字符串中总共会出现8种不同的字符,每个重复9次即可。有了这个尺度,再玩游戏,那绝对能通关了吧,如图6所示。

若要凑出随机不确定性值为4,那也很容易,比如可以将2/32* math.log(32/2,2)算上自己加上16次,2/32分子分母各乘以2,得到4/64,也就是说,玩家输入16种不同的字符,每个字符重复4次即可。其实这里已经可以看出明显的规律,若输入的字符串字符概率均等,当字符种类是2时,则随机不确定性值是1;当字符种类是4时,则随机不确定性值是2;当字符种类是8时,则随机不确定性值是3;当字符种类是16时,则随机不确定性值是4。只要字符出现概率均等,那么随机不确定性值的计算就可以用以2为底的对数函数来获得。这里的随机不确定性值,实际上就是描述信息混乱程度的信息熵,它的单位是比特。信息熵和数据存储容量,其实是不同视角之下的同一件事。

信息熵在线玩

本文提供的小程序可以用来测试简短字符串的信息熵,如果要检测较大文件的信息熵,就要增加许多代码,好在网络上提供了在线测试文件信息熵的工具,不仅能计算信息熵的值,还能够用直观的图表显示出文件中不同字符所出现的频率,这个在线工具的地址是https://servertest.online/entropy。例如,可借用此在线工具分析某张照片的原始BMP格式(如上页图7)和转成JPG格式后,信息熵值及信息分布频率的不同,如上页图8和图9。

两张图的信息熵值差异不大,为14多一些,但JPG图片容量大小只有原始图片的一半,可以发现,JPG图片中,不同信息(字符)在空间中是均匀分布的。如果将原始BMP格式图片转化成16色位图,虽然最终文件容量和JPG文件差不多,但图像质量却大受影响,这从信息熵值的变化以及信息频率分布图中就可以看出端倪,如图10和图11。

16色位图的信息熵只有4多一些,从频率分布图看,某些字符被大量使用,但图中也存在着大块空白,差不多容量相同的文件,16色位图中每个字符所可能表达的信息的多样性,要远小于JPG格式的图片。从这个例子也可以看出,信息熵值对应着文件中每个符号可能携带的信息量。

大家可以利用这个在线工具,分析比对不同文件压缩前后的信息熵和信息频率分布的情况,针对不同教学目标,组织多样的教学实践活动。直观互动的体验,再结合数字计算,有助于提高对信息熵这个抽象概念的理解。

猜你喜欢

字符串信息熵字符
Python实现图片转字符画
正则表达式快速入门
图片轻松变身ASCⅡ艺术画
近似边界精度信息熵的属性约简
一种基于PowerBuilder环境字符串相似度算法
基于信息熵的承运船舶短重风险度量与检验监管策略研究
SQL server 2008中的常见的字符串处理函数
信息熵及其在中医“证症”关联中的应用研究
论犯罪信息
倍增法之后缀数组解决重复子串的问题