周末幼衰,陪男朋友去電影院看了《復仇者聯(lián)盟4:終局之戰(zhàn)》,作為一個漫威粉三個小時看的是意猶未盡擂涛。出來之后奕翔,準備和女朋友聊一聊漫威這十年。
在《復仇者聯(lián)盟》電影中先改,滅霸畢生都有一個目標疚察,那就是通過抹除一半的生命來維持宇宙的平衡。
并且仇奶,滅霸還說貌嫡,這個抹除過程是:隨機性的、不夾私情、絕對公平衅枫、無論貴賤嫁艇。
那么,到底什么是隨機弦撩?他所謂的隨機真的如他所說是不夾私情步咪、絕對公平以及無論貴賤的嗎?
隨機性
隨機性這個詞是用來表達目的益楼、動機猾漫、規(guī)則或一些非科學用法的可預(yù)測性的缺失。一個隨機的過程是一個不定因子不斷產(chǎn)生的重復過程感凤。
提到隨機性悯周,不得不提的就是隨機數(shù),隨機數(shù)在計算機應(yīng)用中使用的比較廣泛陪竿,最為熟知的便是在通信安全和現(xiàn)代密碼學等領(lǐng)域中的應(yīng)用禽翼。
隨機數(shù)分為真隨機數(shù)和偽隨機數(shù),我們程序中使用的基本都是偽隨機數(shù)族跛。
? ? ·? 真隨機數(shù)闰挡,通過物理實驗得出,比如擲錢幣礁哄、骰子长酗、轉(zhuǎn)輪、使用電子元件的噪音桐绒、核裂變等夺脾。需要滿足隨機性、不可預(yù)測性茉继、不可重現(xiàn)性咧叭。
? ? ·? 偽隨機數(shù),通過一定算法和種子得出烁竭。軟件實現(xiàn)的是偽隨機數(shù)佳簸。
只要這個隨機數(shù)是由確定算法生成的,那就是偽隨機颖变。只能通過不斷算法優(yōu)化,使你的隨機數(shù)更接近隨機听想。
有限狀態(tài)機不能產(chǎn)生真正的隨機數(shù)的腥刹。所以,現(xiàn)代計算機中汉买,無法通過一個純算法來生成真正的隨機數(shù)衔峰。無論是哪種語言,單純的算法生成的數(shù)字都是偽隨機數(shù),都是由可確定的函數(shù)通過一個種子垫卤,產(chǎn)生的偽隨機數(shù)威彰。
為啥滅霸并不公平?
前面我們提到過穴肘,真隨機數(shù)要滿足隨機性歇盼、不可預(yù)測性、不可重現(xiàn)性评抚。
我們按照這三個性質(zhì)逐一分析下豹缀,看看滅霸到底是不是公平的。
隨機性
隨機性慨代,指的是不存在統(tǒng)計學偏差邢笙,是完全雜亂的數(shù)列。
復聯(lián)3中侍匙,滅霸打了指響之后氮惯,復仇者聯(lián)盟中存活和死亡的名單其實并不是隨機的。其中很多對CP都是殺1留1的想暗。如鋼鐵俠——蜘蛛俠妇汗、美隊——冬兵、火箭浣熊——格魯特江滨、蟻人——黃蜂女等铛纬。
而且,還有一點就是唬滑,如果真的是隨機性的話告唆,那么滅霸自己也是有一定的概率會被抹除的,但是晶密,他早就知道自己不會被抹除擒悬,并且已經(jīng)制定好了退休計劃。
并且稻艰,在復聯(lián)3中懂牧,奇異博士用時間寶石和滅霸換了鋼鐵俠的生命,說明滅霸其實是選擇性的進行抹除的尊勿。
可見僧凤,滅霸的指響抹除過程并不是隨機的。
不可預(yù)測性
不可預(yù)測性元扔,指的是不能從過去的數(shù)列推測出下一個出現(xiàn)的數(shù)躯保。
這一點了解電影的朋友應(yīng)該都知道,奇異博士曾經(jīng)利用時間寶石穿越了時空澎语,預(yù)測了未來途事,并看到了14000605種可能验懊。
可見,滅霸的指響抹除過程并不是不可預(yù)測的尸变。
不可重現(xiàn)性
不可重現(xiàn)性义图,除非將數(shù)列本身保存下來,否則不能重現(xiàn)相同的數(shù)列召烂。
在復聯(lián)3中碱工,鋼鐵俠問奇異博士,14000605種可能中骑晶,勝利的有多少種痛垛。奇異博士回答:1種⊥盎祝可見匙头,滅霸的指響抹除過程并不是不可預(yù)測的。
在復聯(lián)4中仔雷,最后奇異博士對鋼鐵俠比了下面這樣一個手勢蹂析。說明,他看到的那唯一一種勝利的可能要復現(xiàn)了碟婆。
可見电抚,滅霸的指響抹除過程并不是不可復現(xiàn)的。
綜上竖共,滅霸的指響抹除過程不符合隨機性蝙叛、不可預(yù)測性以及不可復現(xiàn)性。所以公给,滅霸的指響抹除過程并不是真正的隨機的借帘。
通過現(xiàn)象來看,滅霸的抹除操作很可能只是通過簡單的分層抽樣實現(xiàn)的淌铐。簡單操作過程如下:
· 1肺然、把需要特殊處理,不做抹除的人的DNA單獨從所有物種的DNA庫中識別出來腿准,并保存到緩存中际起。
? ? ·? 2、根據(jù)不同的條件把DNA庫中的所有生命體劃分成若干區(qū)塊吐葱,如地球人街望、阿斯加德人等。把他們的DNA信息保存到不同的數(shù)據(jù)庫中弟跑。在遍歷的過程中它匕,如果遇到緩存中已有的數(shù)據(jù),則跳過窖认。
· 3豫柬、再根據(jù)物種多樣性,如性別扑浸、年齡段烧给、職業(yè)等把同一個分庫中的數(shù)據(jù)分別劃分到不同的表中,保證每一張分表中都包含了完整的物種多樣性喝噪。
? ? ·? 4础嫡、遍歷所有數(shù)據(jù)庫,按順序的刪除每個數(shù)據(jù)庫中一半的分表酝惧。如地球人的數(shù)據(jù)庫中共有1024張表榴鼎,只保留512張即可。
? ? ·? 5晚唇、再把緩存中的數(shù)據(jù)同步到數(shù)據(jù)庫中巫财。
這樣,在后面需要復活這些人的時候哩陕,只需要找到數(shù)據(jù)庫的Binlog平项,把數(shù)據(jù)重新寫入數(shù)據(jù)庫就行了。
真隨機數(shù)生成器
真正的隨機數(shù)是使用物理現(xiàn)象產(chǎn)生而不是計算機程序產(chǎn)生的悍及。生成隨機數(shù)的設(shè)備我們稱之為真隨機數(shù)生成器闽瓢。
這樣的設(shè)備通常是基于一些能生成低等級、統(tǒng)計學隨機的“噪聲”信號的微觀現(xiàn)象心赶,如熱力學噪聲扣讼、光電效應(yīng)和量子現(xiàn)象。
從某種程度上來說缨叫,基于經(jīng)典熱噪聲的隨機數(shù)芯片讀取當前物理環(huán)境中的噪聲椭符,并據(jù)此獲得隨機數(shù)。這類裝置相對于基于軟件算法的實現(xiàn)弯汰,由于環(huán)境中的變量更多艰山,因此更難預(yù)測。
然而在牛頓力學的框架下咏闪,即使影響隨機數(shù)產(chǎn)生的變量非常多曙搬,但在每個變量的初始狀態(tài)確定后,整個系統(tǒng)的運行狀態(tài)及輸出在原理上是可以預(yù)測的鸽嫂,因此這一類裝置也是基于確定性的過程纵装,只是某種更難預(yù)測的偽隨機數(shù)。
但是据某,量子力學的發(fā)現(xiàn)從根本上改變了這一局面橡娄,因為其基本物理過程具有經(jīng)典物理中所不具有的內(nèi)稟隨機性,從而可以制造出真正的隨機數(shù)產(chǎn)生器癣籽。
據(jù)美國國家標準與技術(shù)研究院(NIST)官網(wǎng)消息挽唉,該機構(gòu)研究人員在2018年4月出版的《自然》雜志上撰文指出滤祖,他們開發(fā)出一種新方法,可生成由量子力學保證的隨機數(shù)字瓶籽。新技術(shù)超越了此前獲得隨機數(shù)字的所有方法匠童,得到了“真正的隨機數(shù)字”,有助增強密碼系統(tǒng)的安全性塑顺。
NIST數(shù)學家彼特·比爾霍斯特進一步解釋說:“諸如翻轉(zhuǎn)硬幣之類的情況似乎是隨機的汤求,但如果能看到硬幣確切的下落路徑,最終結(jié)果也是可以預(yù)測的严拒。因此扬绪,很難保證給定經(jīng)典來源真正不可預(yù)測。量子力學在產(chǎn)生隨機性方面表現(xiàn)更好裤唠,量子隨機是真正的隨機挤牛,因為對處于‘疊加’狀態(tài)的量子粒子進行測量,得到的結(jié)果基本上是不可預(yù)測的巧骚∩薜撸”
在復聯(lián)4中,也有很多和量子物理有關(guān)的知識劈彪,甚至最終可以扭轉(zhuǎn)乾坤也是依靠的量子領(lǐng)域竣蹦。漫威電影的宗旨可以高度概括成以下四句話:遇事不決,量子力學沧奴。 解釋不通痘括,穿越時空。 篇幅不夠滔吠,平行宇宙纲菌。 定律不足,高維人族疮绷。
Java中的隨機數(shù)生成器
Java中生成隨機數(shù)還是比較簡單的翰舌,Java提供了很多種API可以供開發(fā)者使用。
通過時間獲取
在Java中冬骚,可以通過System.currentTimeMillis()來獲取當前時間毫秒數(shù):
若要獲取指定范圍的數(shù)字椅贱,只需要對數(shù)字進行取模就行了,如下方法可以獲得0-99的隨機數(shù):
Math.random()
通過Math.random()可以返回0(包含)到1(不包含)之間的double值只冻。使用方法如下:
若要獲取int類型的整數(shù)庇麦,只需要將上面的結(jié)果轉(zhuǎn)行成int類型即可。比如喜德,獲取[0, 100)之間的int整數(shù)山橄。方法如下:
Random類
Java提供的偽隨機數(shù)發(fā)生器有java.util.Random類和java.util.concurrent.ThreadLocalRandom類。
Random類采用AtomicLong實現(xiàn)舍悯,保證多線程的線程安全性航棱,但正如該類注釋上說明的睡雇,多線程并發(fā)獲取隨機數(shù)時性能較差。
多線程環(huán)境中可以使用ThreadLocalRandom作為隨機數(shù)發(fā)生器饮醇,ThreadLocalRandom采用了線程局部變量來改善性能入桂,這樣就可以使用long而不是AtomicLong,此外驳阎,ThreadLocalRandom還進行了字節(jié)填充,以避免偽共享馁蒂。
如使用Random獲取[0, 100)之間的int整數(shù)呵晚,方法如下:
強隨機數(shù)發(fā)生器
強隨機數(shù)發(fā)生器依賴于操作系統(tǒng)底層提供的隨機事件。強隨機數(shù)生成器的初始化速度和生成速度都較慢沫屡,而且由于需要一定的熵累積才能生成足夠強度的隨機數(shù)饵隙,所以可能會造成阻塞。熵累積通常來源于多個隨機事件源沮脖,如敲擊鍵盤的時間間隔金矛,移動鼠標的距離與間隔,特定中斷的時間間隔等勺届。所以驶俊,只有在需要生成加密性強的隨機數(shù)據(jù)的時候才用它。
Java提供的強隨機數(shù)發(fā)生器是java.security.SecureRandom類免姿,該類也是一個線程安全類饼酿,使用synchronize方法保證線程安全,但jdk并沒有做出承諾在將來改變SecureRandom的線程安全性胚膊。因此故俐,同Random一樣,在高并發(fā)的多線程環(huán)境中可能會有性能問題紊婉。
這個鍋药版,研發(fā)人員不背!S骼纭槽片!
根據(jù)我的猜想。對于無限手套這個產(chǎn)品株汉,產(chǎn)品經(jīng)理最初的需求可能只是滿足使用者的一個愿望而已筐乳,而幾顆寶石就像是七龍珠一樣,集齊之后打個指響就可以實現(xiàn)愿望乔妈。
開發(fā)者只是提供了一個可以滿足愿望的API接口蝙云,參數(shù)是一個Callback,具體做什么事情路召,完全是使用者傳進來的想法而已勃刨。就像滅霸要抹除一半的生命波材、綠巨人想要把被抹掉的人救回來、而鋼鐵俠只是想把壞人抹掉而已身隐。
最后廷区,Tony, Love You 3000 Times.