有一個(gè)挺有趣的定理:猴子與打字機(jī)
猴子和打字機(jī)(Monkeys and Typewriters)院溺,如果無數(shù)多的猴子在無數(shù)多的打字機(jī)上隨機(jī)的打字凉逛,并持續(xù)無限久的時(shí)間纲爸,那么在某個(gè)時(shí)候覆醇,它們必然會(huì)打出莎士比亞的全部著作。猴子和打字機(jī)的設(shè)想在20世紀(jì)初被法國(guó)數(shù)學(xué)家Emile Borel推廣锌俱,但其基本思想——無數(shù)多的人員和無數(shù)多的時(shí)間能產(chǎn)生任何/所有東西——可以追溯至亞里士多德晤郑。 來自:百度百科
于是乎,我就用電腦模擬試了一下
首先我選用的是常用的中文漢字嚼鹉,Unicode編碼從[\u4e00-\u9fa5],這之間共有20901個(gè)漢字
-
然后我寫了段程序讓電腦逐個(gè)打出漢字直到打出我想要的內(nèi)容為止
- 我想要電腦打出 “雞你太美” 這句話
-
我的代碼如下:
var str = "雞你太美" var strLen = str.length - 1 var lastChinese = "" var index = 0 var startTime = Date.now() for (var i = 0; ; i++) { var num_10 = 19968 + parseInt(Math.random() * 20901) var str_16 = num_10.toString(16) str_16 = "\\u" + str_16 lastChinese = eval("'" + str_16 + "'") if (lastChinese == str[index]) { if (index == strLen) { console.log("found!") console.log("在第" + " " + i + " " + "位打印出來了" + "\"" + str + "\"") break } index++ } else { index = 0 } } var endTime = Date.now() var spendTime = endTime - startTime console.log("用時(shí):" + " " + spendTime + "ms")
-
開始測(cè)試
我想要電腦打出 “雞”
-
$ node test.js found! 在第 1932 位打印出來了"雞" 用時(shí): 22ms $ node test.js found! 在第 44729 位打印出來了"雞" 用時(shí): 271ms $ node test.js found! 在第 1663 位打印出來了"雞" 用時(shí): 18ms $ node test.js found! 在第 17094 位打印出來了"雞" 用時(shí): 126ms
基本都是秒出結(jié)果
我想要電腦打出 “雞你”
因?yàn)樵谖易约弘娔X上運(yùn)行時(shí)間太長(zhǎng)而且風(fēng)扇要起飛驱富,于是放在了云服務(wù)器上跑
-
可惜結(jié)果我沒記錄下來锚赤,但我清楚的記得
一個(gè)是在1300多萬位處打印出來了,耗時(shí)大約33秒
其他結(jié)果不穩(wěn)定褐鸥,有的就一直出不來
-
就在我在寫下面的總結(jié)的時(shí)候又出現(xiàn)一結(jié)果 哈哈哈
found! 在第 476324604 位打印出來了"雞你" 用時(shí): 502102ms found! 在第 445763874 位打印出來了"雞你" 用時(shí): 452780ms
至于想打印雞你太美 我就沒往下再等了
-
總結(jié)和收獲
- 想要的內(nèi)容越多线脚,耗時(shí)就越多,基本呈指數(shù)型增長(zhǎng)叫榕,當(dāng)然我同時(shí)只用了一只猴子在打字
- 如果打英文相較于中文會(huì)更快,畢竟英文才26個(gè)字母和1個(gè)空格晰绎,而漢字是20901個(gè)排列組合
- “猴子和打字機(jī)”定理是用來描述無限的本質(zhì)的最好方法之一
- 很多封裝好的方法來處理大量的數(shù)據(jù)可能寫法上很方便寓落,但效率卻并不太高。因此荞下,懂得方法的底層實(shí)現(xiàn)很重要