今天是3月14日,圆周率日,昵称派派节。你能背出圆周率的前几位?
我只能背出“山巅一寺一壶酒”。刚好够用,因为圆周率节一般在3月14日1:59开始庆祝,这样至少我不会错过开场的红酒。小时候背到这里就到此为止了,属于童子功。如果像《少年派的奇幻漂流》里的少年派那样,一口气背了满满一黑板,那么现在就可以在儿子面前炫耀了。
德国同事像发现新大陆一样,兴高采烈地说:“你知道吗?披萨(pizza)这个词其实告诉了我们怎么计算披萨的体积。如果披萨的半径是z,厚度是a,那么体积就是 pi * z *z *a!哦耶!”
呃……好吧。
去年,我们经历了百年一遇的圆周率时:3月14日15年9时26分53秒。这时辰够猛,不知有多少孩子在这个时辰出生。不过,这还不是最猛的,最猛的是1592年3月14日上午6时53分58秒,记作3/14/1592 6:53:58,被称为“终极圆周率日”,绝无仅有,空前绝后。照理说,当时的人们应该热烈庆祝吧?呵呵, 错了,当时的人类还没有把圆周率算到这么多位。当时,欧洲刚刚把圆周率推算到3.1415926到3.1415927之间。而在遥远的东方,中国人完成这项工作时,比欧洲早了1000年。
圆周率是非常神奇的数字。不管你怎么画圆,它的周长和直径总是这样一个比值,一点也不多,一点也不少,充满了神秘的宿命感,冥冥之中似乎蕴藏着一个天大的道理。荒唐的是,它偏偏被称为“无理数”。人类对圆周率的认识,从某种程度上显示了对这个宇宙认识的水平。古代中国的水平世界领先,可是雏凤清于老凤声,欧洲比我们晚,但却给我们带来了现代科学,这是更值得我们反思的。
我的博客有一次发福利的时候,需要从留言中随机挑选几位幸运者。如何做到真正的随机?我就借鉴了土木坛子的算法用到了圆周率,略作改动。方法是这样的:
- 取最后一名留言者留言时的两位分钟数;
- 找到这个数在圆周率中第一次出现的位置,抽出其后面的十个数字(假设留言者总数不超过99位,如果是超过99位不到1000位则需要取15个数字,以此类推),依次两两分成五组,得到五个两位数;
- 剔除我自己和重复发留言的网友后,将所有的留言者按先后顺序排队,每人有一个编号(最早的为01号,以此类推),并得到总人数;
- 将上述五个数字百分化,即除以99(假如是多于99位则需要千分化,以此类推),再乘上总人数,四舍五入取整数,这五组整数就是对应的幸运编号。
这个方法的R代码,我列在后面。只要把urlink更改成本博客任何一篇帖子的网址,就可以看任何一篇帖子幸运留言者的名单了。
祝大家派派节快乐!
lucky <- function(urlink){
clear <- function(x) { # 处理字符串
y <- gsub('^[^<]*', '', x)
y <- gsub('says:.*', '', y)
y <- gsub('<[^>]+>', '', y)
y <- gsub(' ', '', y)
return(y)
}
mypi <- '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989' #http://pi.911cha.com/
commentformat <- 'class="fn"'
webpage <- readLines(urlink, encoding='UTF-8')
id.ps <- grep(commentformat, webpage)
id <- clear(webpage[id.ps])
time <- strptime(paste(substr(webpage[id.ps + 2], 5, 14), substr(webpage[id.ps + 2], 19, 23)), '%Y-%m-%d %H:%M', tz = 'GMT')
time <- time[-regexpr('大鹏', id) > 0]
id <- id[-regexpr('大鹏', id) > 0] # remove my own
id <- unique(id)
lastcomment <- format(time[time == max(time)], '%M')
pc <- regexpr(lastcomment, mypi)[1]
ndigits <- nchar(length(id))
lucky <- unique(id[ceiling(as.numeric(substring(mypi, pc + seq(ndigits, length.out =3, by = ndigits), pc + seq(ndigits * 2 - 1, length.out =3, by = ndigits))) / 10^ndigits * length(id))])
return(lucky)
}
urlink <- 'http://pzhao.org/archives/17520'
lucky(urlink)
urlink <- 'http://pzhao.org/archives/18732'
lucky(urlink)