當前位置:
首頁 > 知識 > 圓周率里有每個人銀行卡密碼和生日?程序員操作亮了

圓周率里有每個人銀行卡密碼和生日?程序員操作亮了

圓周率里有每個人的銀行卡密碼和生日?這個程序員的操作亮了

編者按:3月14日,這也是一個特殊的節日,是國際數學家聯盟設立的國際數學日,也叫圓周率日、或者π日。原因很簡單,π約等於3.14嘛!

圓周率的概念,在人類文明史上由來已久。一塊產於公元前1900年到1600年前的巴比倫石匾上,記載著圓周率= 25/8 = 3.125;古埃及文物,萊因德數學紙草書(Rhind Mathematical Papyrus)則記載圓周率等於16/9的平方,約等於3.1605。在中國,早在周朝成書的《周髀算經》中,就曾經有過「周三徑一」的表述。

圖片來源:視覺中國

有人好奇,既然圓周率是無限不循環小數,會不會包括這個世界上的任何信息,包含了這個世界?

能否包含「任何信息」不好說,但一個冷知識是,圓周率里有每個人的銀行卡密碼!不信?看看這位來自知乎的程序員朋友是怎麼證明的。

以下內容來自知乎用戶vortex的回答:

這個問題挺有意思,非數學專業,就從計算機的角度分析一下這個問題吧。

為了分析這個問題,我先用y-cruncher跑出了π的前10億位,感覺應該夠用!

不夠用也沒辦法了,內存有限,而且跑程序時CPU佔用率100%,風扇吹的我心慌。

讓人無奈的佔用率

計算前10億位共用時190.515秒,數據以txt的格式保存,大小976.563MB。

下面開始我們的分析工作。

先簡單的搜索一下,發現自己能想到的幾個六位數字都出現了(包括我的銀行卡密碼)

舉幾個例子:

000000出現在小數點後第1,699,927位

111111出現在小數點後第255,945位

222222出現在小數點後第963,024位

123456出現在小數點後第2,458,885位

註:每行有1024個字元,所以計算公式應為1024*(行數-1)+列數-2,其中2為開頭的「3.」

但是不可能手動把000000~999999全驗證一遍吧(雖然我今天很閑),還是要寫個程序跑一下。

不考慮複雜度問題的話,代碼很快就寫完了,只有短短的14行。

因為我用的是index,如果密碼不存在的話,則會直接拋出異常。但是我的直覺是000000~999999是都存在的(其實是我懶得多寫代碼了)

檢索的速度大概是1000條/秒,接下來就是耐心的等待過程。

程序跑完了!不出所料,所有的六位銀行卡密碼在π中都是存在的。

最後出現的密碼是569540,位於小數點後14,118,307位。(10億位有點過剩啊!)

統計數據截圖

雖然π是無限不循環的,但是對我來說只截止到小數點後7,599,477位。

第一次收到這麼多的贊。

於是我又寫了個程序把π前10億位中的生日給跑了出來,生日的範圍為1920~2020共計101年。

上代碼~供有興趣的朋友研究,可以一起討論如何計算的更快。(感覺這個完全可以出一個面試題的!我水平是不太行,下面是我想到的方法。)

大家不要私信給我發銀行卡密碼了!很危險的!真要查的話,有個朋友分享了在線查詢的鏈接。範圍精確到2億位。

下面的內容非程序員可忽略...

經評論區的朋友們啟發,而且實在受不了別人噴我程序運行的慢了。又寫了一個更快的檢索6位數字(就是所謂的銀行卡密碼)的演算法。

感興趣的程序員可以看一下。我感覺速度還行。十幾秒鐘就能檢索完畢。更快的我暫時也還沒想到……畢竟答主還只是一個大二在校生,也沒搞過ACM競賽,水平有限。

為程序員的智慧點贊!

本文轉自知乎話題「圓周率里包含你的銀行卡密碼嗎?」


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員之家 的精彩文章:

當親戚問你工資,程序猿如何作答,簡直不能再機智
前端開發真的會被取代嗎?

TAG:程序員之家 |