无意之中看到这样一种网页“读心术:这个程序有着能够看穿你心思的特殊能力,试试吧”,如http://www.souxin.com/dxs.htm 或 http://www.91cool.net/heart.html

试过之后大感惊奇,该网页怎么竟有如此魔力?但我毕竟是个无神论者,而且用的又是Chrome浏览器,查看网页的源代码很方便,于是便查看网页源代码。找了半天,发现了相关的代码如下:
<SCRIPT language=javascript> 
ax=0;
function writeTable() {
        ax=Math.round(Math.random()*26);
        alphaArray=new Array("a", "n", "b", "d", "f", "h", "{", "i", "l", "v", "x", "z", "I", "J", "M", "N", "o", "O", "R", "S", "T", "U", "m", "6", "^", "u", "_", "[", "]")
        table="<table border=0 cellspacing=1 cellpadding=1 width='100%'><tr>"
        j=1;
        for ( i = 99 ; i >= 0 ; i-- ) {
                a=Math.round(Math.random()*26);
                if ( i%9 == 0 && i < 89 ) 
                        a=ax;
                table+="<td class='numtd'>"+i+"</td><td class='symtd'>"+alphaArray[a]+"</td>"
                 if ( j%10 == 0 ) 
                         table+="</tr><tr>" 
                 j++
        }
        table+="</table>"
        sym.innerHTML=table
        sh.innerHTML=""
}
function showAnswer() {
        sh.innerHTML=alphaArray[ax]
        sym.innerHTML="<span class=big><a href="javascript:writeTable()" mce_href="javascript:writeTable()" class=hot>Try Next 再试一次</a></font></span><br><br>"
}
</SCRIPT> 

 

看了又看也没发现这段代码有何神奇之处,无非就是打印输出表格,用到了随机数改变输出的图像顺序而已。

我忽然注意到了“ i < 89”这一条件,认定此处必有玄机。我于是算了一算,发现90~99所有的数按照“读心术”的要求运算之后都是81,而80~89运算之后都是72,70~79是63,以此类推分别是54、45、36、27、18和0.只要保证0、18、27、36、45、54、63、72、81这几个数所对应的图像是相同的就可以了。查看“读心术”网页打印出来的图像,果然如此。
继续看代码,发现了“i%9 == 0”这一判断条件,再一观察,发现上面那几个关键的数(0、18、27、36、45、54、63、72、81)确实是9的倍数。代码中当遇到小于89的9的倍数时,强制令a=ax,这样一来便保证了9的倍数对应的图像是相同的。于是,对于任何符合两位数,减去自己的个位和十位后,所对应的图像都是相同的。这就是所谓“读心术”程序的trick。