国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

信息熵的直觀體驗(yàn)

2018-10-16 01:24陳凱
中國信息技術(shù)教育 2018年19期
關(guān)鍵詞:字符串信息熵字符

陳凱

胡亂打字通關(guān)游戲

一些信息技術(shù)教材在提到“信息”的概念時,會引用香農(nóng)的觀點(diǎn):“信息是能夠用來消除不確定性的東西?!边@里的“不確定性”其實(shí)指的是隨機(jī)不確定性。為什么所謂的信息和隨機(jī)不確定性有關(guān)呢?這個問題可不簡單,并不是三言兩語就能夠說明白的。為了對所謂的隨機(jī)不確定性有直觀的感受,不妨先來看一個簡單的通關(guān)游戲。游戲是用Python語言寫的,運(yùn)行界面如圖1所示。

游戲提示說,輸入合適的口令,才能通關(guān)到下一步,可是口令是什么呢?這時候只有隨便敲打鍵盤看自己運(yùn)氣了。唯一的要求是輸入的字符數(shù)量要多于50個。至于輸入的字符是什么,輸入的字符順序怎樣,輸入的字符是否重復(fù),這些都無所謂。然而,也許玩家無論怎樣輸入字符,都無法過關(guān),如圖2所示。

再來一次,可還是不行,如圖3所示。

然而,筆者“隨便”敲打輸入一大串字符,就奇跡般地過關(guān)了,如圖4所示。

多試幾次,結(jié)果也是這樣。筆者輸入的字符看似完全沒有規(guī)律,但每次都能順利過關(guān)。實(shí)際上,這些字符確實(shí)是胡亂敲打輸入的,但在敲打輸入時,有一個非常隱蔽的訣竅。仔細(xì)觀察,我們可以發(fā)現(xiàn),輸入字符后代碼會反饋一串帶小數(shù)點(diǎn)的數(shù)字。玩家前兩次輸入后,得到的數(shù)字大約是3.14和2.42,但筆者輸入字符后,這串?dāng)?shù)字是3.07。在Python程序代碼中,存在著一句判斷語句,當(dāng)這個數(shù)字大于2.95、小于3.1的時候,就能完成游戲通關(guān)。為了便于玩家通關(guān),代碼里將數(shù)字顯示在了屏幕上,如果不顯示這個數(shù)字,要通關(guān)就更困難了。

這個數(shù)字究竟是怎么來的呢?它代表的就是根據(jù)玩家所輸入的一大串字符所計(jì)算出來的隨機(jī)不確定性。數(shù)字越大,隨機(jī)不確定性也就越大,數(shù)字越小,隨機(jī)不確定性也就越小。為了能夠通關(guān),我們就必須把握好所輸入的字符的隨機(jī)不確定性??墒?,怎么把握輸入字符的隨機(jī)不確定性呢?再一次觀察筆者輸入的字符,可以發(fā)現(xiàn)總共有十種不同的字母,其中九種字符出現(xiàn)的概率大致是相同的,而字符“g”出現(xiàn)的概率遠(yuǎn)小于其他字符。當(dāng)然,出現(xiàn)概率被降低的字母不一定是“g”,再一次玩游戲時,也可以降低其他字母的概率,若是不公開說明,旁人是很難發(fā)現(xiàn)其中蹊蹺的。那么,輸入的每一串字符的隨機(jī)不確定性是怎么計(jì)算出來的呢,且看完整的Python代碼,如圖5所示。

代碼中用到了Counter類,它的作用是跟蹤每個字符出現(xiàn)的次數(shù),lns變量存儲的是整個字符串的長度,count是某個字符在整個字符串中總共出現(xiàn)的次數(shù)。代碼中最關(guān)鍵的一段數(shù)學(xué)公式,就是count/ lns*math.log(lns/count,2)。這段公式到底起什么作用呢?我們可以通過輸入不同的字符來試試看。例如,輸入字符串a(chǎn)aaa,則count為4,lns也是4,count除以lns,或lns除以count,都得到1,然后,對于數(shù)字1,取以2為底的對數(shù),這其實(shí)就是問2的幾次方是1,結(jié)果是0。代碼中for循環(huán)結(jié)構(gòu)所做的工作,是對出現(xiàn)的不同的字符進(jìn)行上述運(yùn)算后,再將結(jié)果累加起來,不過因?yàn)樽址產(chǎn)aaa只有一種字母,所以等于沒有做加法,結(jié)果自然還是0。數(shù)字0意味著玩家輸入的字符串中的每個字母非常有規(guī)律,隨機(jī)不確定性低到了極點(diǎn)。

如果輸入的是字符串a(chǎn)abb,則對于第一種字母a,count為2,lns為4,count除以lns得到0.5,lns除以count就得到2,然后,對于數(shù)字2,取以2為底的對數(shù),這其實(shí)就是問2的幾次方是2,結(jié)果是1。最后,循環(huán)語句實(shí)際執(zhí)行的操作就是0.5*1+0.5*1,結(jié)果為1。這就能看出,字符串a(chǎn)abb與字符串a(chǎn)aaa相比,輸入的每個字母的隨機(jī)不確定性要高一些。

湊數(shù)通關(guān)法及其背后的深意

假設(shè)事先知道,當(dāng)輸入字符串的隨機(jī)不確定性值在2.95和3.1之間就能通關(guān)。那么,怎么用一堆貌似胡亂輸入的字符串湊出3.0這個數(shù)字呢?最簡單的辦法就是先湊出3/8,然后將3/8算上它自己累加8次,湊數(shù)時需要一些逆向的思維:

3/24代表什么呢?其實(shí)就是說,如果輸入的字符串長度是24,那么每個字符需要出現(xiàn)3次。不過根據(jù)剛才游戲的要求,規(guī)定玩家輸入的字符數(shù)量要多于50,那么只要分子分母各乘以3就可以了,也就是說,輸入72個字符,每個字符出現(xiàn)9次,這就意味著字符串中總共會出現(xiàn)8種不同的字符,每個重復(fù)9次即可。有了這個尺度,再玩游戲,那絕對能通關(guān)了吧,如圖6所示。

若要湊出隨機(jī)不確定性值為4,那也很容易,比如可以將2/32* math.log(32/2,2)算上自己加上16次,2/32分子分母各乘以2,得到4/64,也就是說,玩家輸入16種不同的字符,每個字符重復(fù)4次即可。其實(shí)這里已經(jīng)可以看出明顯的規(guī)律,若輸入的字符串字符概率均等,當(dāng)字符種類是2時,則隨機(jī)不確定性值是1;當(dāng)字符種類是4時,則隨機(jī)不確定性值是2;當(dāng)字符種類是8時,則隨機(jī)不確定性值是3;當(dāng)字符種類是16時,則隨機(jī)不確定性值是4。只要字符出現(xiàn)概率均等,那么隨機(jī)不確定性值的計(jì)算就可以用以2為底的對數(shù)函數(shù)來獲得。這里的隨機(jī)不確定性值,實(shí)際上就是描述信息混亂程度的信息熵,它的單位是比特。信息熵和數(shù)據(jù)存儲容量,其實(shí)是不同視角之下的同一件事。

信息熵在線玩

本文提供的小程序可以用來測試簡短字符串的信息熵,如果要檢測較大文件的信息熵,就要增加許多代碼,好在網(wǎng)絡(luò)上提供了在線測試文件信息熵的工具,不僅能計(jì)算信息熵的值,還能夠用直觀的圖表顯示出文件中不同字符所出現(xiàn)的頻率,這個在線工具的地址是https://servertest.online/entropy。例如,可借用此在線工具分析某張照片的原始BMP格式(如上頁圖7)和轉(zhuǎn)成JPG格式后,信息熵值及信息分布頻率的不同,如上頁圖8和圖9。

兩張圖的信息熵值差異不大,為14多一些,但JPG圖片容量大小只有原始圖片的一半,可以發(fā)現(xiàn),JPG圖片中,不同信息(字符)在空間中是均勻分布的。如果將原始BMP格式圖片轉(zhuǎn)化成16色位圖,雖然最終文件容量和JPG文件差不多,但圖像質(zhì)量卻大受影響,這從信息熵值的變化以及信息頻率分布圖中就可以看出端倪,如圖10和圖11。

16色位圖的信息熵只有4多一些,從頻率分布圖看,某些字符被大量使用,但圖中也存在著大塊空白,差不多容量相同的文件,16色位圖中每個字符所可能表達(dá)的信息的多樣性,要遠(yuǎn)小于JPG格式的圖片。從這個例子也可以看出,信息熵值對應(yīng)著文件中每個符號可能攜帶的信息量。

大家可以利用這個在線工具,分析比對不同文件壓縮前后的信息熵和信息頻率分布的情況,針對不同教學(xué)目標(biāo),組織多樣的教學(xué)實(shí)踐活動。直觀互動的體驗(yàn),再結(jié)合數(shù)字計(jì)算,有助于提高對信息熵這個抽象概念的理解。

猜你喜歡
字符串信息熵字符
Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫
正則表達(dá)式快速入門
圖片輕松變身ASCⅡ藝術(shù)畫
近似邊界精度信息熵的屬性約簡
一種基于PowerBuilder環(huán)境字符串相似度算法
基于信息熵的承運(yùn)船舶短重風(fēng)險度量與檢驗(yàn)監(jiān)管策略研究
SQL server 2008中的常見的字符串處理函數(shù)
信息熵及其在中醫(yī)“證癥”關(guān)聯(lián)中的應(yīng)用研究
論犯罪信息
倍增法之后綴數(shù)組解決重復(fù)子串的問題
黄平县| 长白| 文水县| 武邑县| 柳江县| 寻乌县| 松桃| 康平县| 兖州市| 昔阳县| 肥东县| 昭觉县| 西安市| 长子县| 高淳县| 开化县| 东乡县| 灵台县| 兴城市| 浮山县| 北流市| 兴化市| 阜阳市| 怀来县| 南华县| 青州市| 维西| 湄潭县| 屏山县| 鄱阳县| 西乌珠穆沁旗| 和政县| 北票市| 巴东县| 固阳县| 池州市| 毕节市| 贡嘎县| 兴隆县| 平山县| 新乐市|