嚴重依賴「偽隨機數」,讓計算機實現真正的隨機有多難?

2021-01-11 36kr

神譯局是36氪旗下編譯團隊,關注科技、商業、職場、生活等領域,重點介紹國外的新技術、新觀點、新風向。

編者按:生活當中看似到處都是隨機。但真正的隨機比你想像的要難得多。其實,我們接觸的絕大多數都是偽隨機數。即便如此,偽隨機數的生成也是個很耗時間和內存的事情。但最近,MIT的研究人員找到了一種經典隨機數生成算法的改進辦法,令隨機數的生成效率提高了很多,確定論的計算機有望將隨機性植入到自己的建構塊裡面。Stephen Ornes對此進行了報導,原文發表在quantamagazine上,標題是:How and Why Computers Roll Loaded Dice

劃重點

計算機軟體和硬體運行的基礎是布爾邏輯,不是概率

FLDR提出了一種將隨機數集成到內置了確定性的軟體和硬體裡面的方法

大部分的隨機數生成算法都是偽隨機,是根據複雜的公式生成的

FLDR算法中時間和內存消耗上都非常高效

對於計算機來說,模擬投擲灌鉛骰子一直是一個難題。

這是一個看似很簡單的練習:讓你想出一個隨機的電話號碼。選出七位數的序列,每一位都要等可能,並且選擇一個數字不會影響到下一個數字。很有可能你選不出來。(不過我的話也不要全信:可以追溯到1950年代的研究表明,我們在數學上其實跟隨機的關係不大,雖然我們都意識不到這一點。)

不要放在心上。計算機在生成隨機性這件事情上做得也不好。本來我們也不指望它們能夠做好:計算機軟體和硬體運行的基礎是布爾邏輯,不是概率。麻省理工學院Probabilistic Computing Project(概率計算項目)的負責人Vikash Mansinghka表示:「計算文化以確定性為中心。這一點表現在幾乎每一個層面上。」

但是計算機科學家希望程序能夠處理好隨機性,因為有時候這就是問題的需要。多年以來,有些人開發出了新穎的算法,儘管這些算法本身不會生成隨機數,但卻提供了巧妙而有效的方式來利用和操縱隨機性。麻省理工學院Mansinghka小組最近就取得了一項最新成果,他們提出了一種算法,叫做「快速搖灌鉛骰子」(Fast Loaded Dice Roller ,FLDR)。這項成果將於今年八月份的在網上舉行的國際人工智慧與統計會議(Conference on Artificial Intelligence and Statistics)上進行展示。

簡而言之,FLDR利用了一個隨機序列來完美地模擬搖一顆灌鉛骰子的情形。(或者是一枚加重的硬幣,或被操縱的卡片組。紐奧良大學的數學家Peter Bierhorst說:「算法展示了怎麼把拋硬幣從完全隨機變成有偏向的。」Bierhorst並非研究的貢獻者,但是他說FLDR成功背後的前提「很吸引人」。

FLDR不會讓你在《地產大亨》遊戲裡面獲得優勢,也不會增加你去拉斯維加斯賭場擲骰子獲勝的機會。但是算法的發明者說,它提出了一種將隨機數集成到內置了確定性的軟體和硬體裡面的方法。給軟硬體引入這種不確定性可以幫助機器做出像人一樣的預測,並能更好地模擬依賴概率的現象,比如氣候或金融市場等。

隨機性是一個很棘手的概念,比乍看之下要棘手。在看不出模式的隨機數序列裡面,每個數字都有相同的出現概率。比方說,Pi本身並不是一個隨機數,但是pi的每一位數字被認為是隨機出現的(數學家稱之為「正規數」):從0到9,每個整數出現的次數相同。

是,Google搜索「隨機數生成器」你是可以找到,但那些生成器生成的並不是純粹的隨機性。現在的處理器也好,搜尋引擎以及密碼生成器也好,它們用的都是「偽隨機」的方法。當然,這些方法對於大多數用途而言都已經足夠接近隨機了,那是根據複雜的公式生成的,但是從理論上來講,如果你知道那個公式的話,就可以預測序列。

科學家嘗試將真正的隨機性植入到機器裡面至少已有80年的歷史了。(在此之前,隨機數來自傳統的備用品,如擲骰子,從混勻的袋子裡面取出編號球,或其他的機械練習。1927年,統計學家對人口普查數據進行採樣,從而得到了一張有40000個隨機數字的表格。)

麻省理工學院的Vikash Mansinghka表示,新的FLDR算法可以幫助科學家把概率植入到確定性計算機當中。

早期的隨機數的來源是物理機器。第一臺產生隨機數的機器是英國統計學家莫裡斯·喬治·肯德爾(Maurice George Kendall)和伯納德·巴賓頓·史密斯(Bernard Babington Smith)的發明。1938年,他們對此進行了描述。機器被放進一間黑屋裡面,然後旋轉一個分成10等分的圓盤,每一份分別用0到9的數字標記。當某人用不規則的間隔敲擊按鍵時,一道霓虹燈或火花就會照亮圓盤,讓它看起來好像被定格了一樣,但只有一個數字可見。後來又發明了另一臺機器,叫做Ernie,這次則是在氖管中用了信號噪聲。從1957年開始,英國的某個彩票就是用它來選出中獎號碼的。

Bierhorst 說,最近以來,為了得到真正的隨機序列,計算機科學家必須研究自然現象,比如宇宙背景輻射或量子系統的不可預測行為才行。他說:「自然界中存在可以利用的隨機過程,這確實是不可預測的。那些忽左忽右躲閃騰挪的電子甚至事先都不知道自己要做什麼。」

但是隨機性只能帶你走那麼遠了。到1940年代後期,物理學家開始生成隨機數來擬合給定的概率分布。這樣的工具(滾灌鉛骰子的理論版)可以更準確地用於模擬現實情況,比方說交通流量或者化學反應。1976年,計算機科學家先驅Donald Knuth和Andrew Yao提出了一種算法,這種算法可以用一串隨機數生成任意加權結果數組的隨機樣本。Mansinghka實驗室的博士生Feras Saad 說:「這是有史以來最省時的算法。」

但不幸的是,Saad 說,這種算法要進行一定的折衷,那種計算機科學家都很熟悉的取捨權衡:很多跑得快的應用使用了大量內存,而使用內存較少的應用則可能需要很長的運行時間。Knuth和Yao的算法屬於第一類,所以算法是很優雅,但是實際使用要佔用大量內存。

但是去年春天時,Saad找到了一種聰明的解決方法。他意識到,當骰子的權重加起來等於2的冪次時,這一算法在時間和內存消耗上都非常高效。因此,對於一個六面骰子,假設滾出數字1到6的機率分別賦予1、2、3、4、5和1的加權。這意味著比方說滾出1的概率為1/16,滾出2的概率為2/16。由於權重的總和是2的冪次(16是2的4次方),所以這套系統的算法在時間和內存消耗上都很高效。

麻省理工學院博士生Feras Saad 幫助設計了一種新的算法,這種算法可以高效、準確地模擬搖灌鉛骰子。

但是,假設權重取值改為1、2、3、2、4、2,總和為14的情況。由於14不是2的冪次方,所以Knuth-Yao算法需要佔用更多的內存。Saad 意識到他可以增加一個權重,從而使得它們的總和總是2的冪次。在這種情況下,他只需給骰子增加一面——讓假設的這一面權重為2,這樣權重加起來就是16了。如果算法選到了原先的6面之一,就記錄下相應的數值。如果選到了莫須有的那一面,就丟棄掉,然後再次運行算法。

這就是FLDR算法效率的關鍵,使得它成為了仿真的一個強大的工具:與原先一般需要佔用大量內存的算法相比,多餘的滾骰子所需佔用的額外內存很小。

FLDR提高了Knuth-Yao算法的效率,並為改善一系列應用指明了方向。氣候變化模擬,作物產量預測,粒子行為模擬,金融市場模型,甚至核武器地下爆炸的探測都取決於按照加權概率分布的隨機數。隨機數是用來保護通過網際網路發送的數據的加密機制的支柱。

Mansinghka說,FLDR還可以幫助研究人員找到將概率整合到計算機處理器裡面的方法,這是他在麻省理工學院實驗室工作的重點。有了這一算法,軟體庫和新的硬體體系結構的設計就可以生成隨機數並以有效的方式去利用這些隨機數。這跟我們過去使用的確定性布爾機器將大相逕庭。

他說:「 我們很可能即將把隨機性集成到軟體和硬體的構建塊當中。」

譯者:boxi。



相關焦點

  • 偽隨機數發生器:你不知道,其實計算機並不能產生隨機數
    在生活中,我們需要用到隨機數的地方很多,例子也很好舉,比如我們買彩票的號碼就是一個隨機數。但是當計算機中需要產生隨機數的時候,絕大多數情況下並不是真的隨機數,我們把它稱為偽隨機數。如果大家對編程有一些基礎的話,那麼對於rand()函數或者random()函數就不會陌生,這兩個函數都是用來產生偽隨機數的,要設定一個隨機種子(數值形式)來讓函數產生偽隨機數。
  • 遊戲中的「真隨機」和「偽隨機」
    遊戲中的「真隨機」和「偽隨機」 「十連保底」「百抽不出貨」「我怎麼不暴擊啊?」類似於這樣的話,是很多遊戲玩家經常會說的。
  • 聊一聊網際網路基礎設施——隨機數
    ,而模擬信號雖然也有,但是沒有設計專門的測量裝置,因此簡單來說,就是純代碼生成,這種隨機數我們一般都稱為偽隨機數。偽隨機數全部依賴代碼和計算機產生的隨機變量,因此這裡如果有黑客專門對此控制的話,那麼很可能會產生帶有規律性的偽隨機數,一旦黑客收集到足夠大量的數據後,進行分析,然後利用概率的原理,理論上來說,是可以破解偽隨機數的。
  • HPB專欄|HPB硬體隨機數—去中心化應用的安全基石
    隨機性的需求和應用在日常生活中隨處可見,如遊戲、彩票、抽樣、公平分配等。格但斯克大學的Marcin Pawlowski教授指出:「世界上每一個電子設備都需要隨機性,而且非常需要隨機性。在任何需要安全通信的場景,都必須生成和依賴加密密鑰。
  • 國際上首次成功實現器件無關的量子隨機數
    以往通常有兩類獲取隨機數的途徑:基於軟體算法實現或基於經典熱噪聲實現。軟體算法實現的隨機數是利用算法根據輸入的隨機數種子給出均勻分布的輸出。然而,對於確定的輸入,固定的算法將給出確定的輸出序列,從這個角度上來說,這類隨機數本質上是確定性的,並不真正隨機。基於經典熱噪聲的隨機數晶片讀取當前物理環境中的噪聲,並據此獲得隨機數。
  • Java 生成隨機數的 5 種方式,你知道幾種?
    當第一次調用 方法時,自動創建了一個偽隨機數生成器,實際上用的是 。當接下來繼續調用 方法時,就會使用這個新的偽隨機數生成器。 方法是 的,因此在多線程情況下,只有一個線程會負責創建偽隨機數生成器(使用當前時間作為種子),其他線程則利用該偽隨機數生成器產生隨機數。Java生成隨機數的幾種高級用法,這篇推薦看一下。 因此 方法是線程安全的。
  • 以三款經典遊戲為例 分析偽隨機設計原理
    為了增加遊戲的可玩性和豐富內容,開發者多會考慮在遊戲中添加一些隨機要素。但是如何把握這個度確實一件既費神又難度很大的事。一般來說,在電子遊戲等娛樂軟體中,一般使用的手段是「偽隨機數生成器」,那麼這一方法是如何應用到遊戲設計中的呢?下面就以三款經典遊戲為例,分析關於「偽隨機」的設計原理。
  • python安全開發軍規之四:使用安全的隨機數生成器
    QA有話說隨機模塊提供的隨機生成器是偽隨機數生成器。所謂偽隨機數,是通過固定的算法生成的,其結果是確定的,可預見的。一般情況下,偽隨機數的生成需要一個種子,如果沒有特別設置,種子就是系統的時鐘。簡而言之,由於偽隨機數算法固定,種子固定,那結果就是可推導和模擬的。
  • 單片機隨機數:rand(),srand()
    通常的做法是以這樣一句代碼srand((unsigned) time(NULL));來取代,這樣將使得種子為一個不固定的數, 這樣產生的隨機數就不會每次執行都一樣了。有討論如下:1.C的函數庫之所以沒有把使用系統時鐘初始化隨機種子這步重要的操作直接放進rand函數的實現中,我覺得至少有三個原因:(1)可以高效產生連續的隨機數,不用每次都初始化;(2)給程式設計師以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數據做種子,而不是系統時鐘;(3)對於只是想產生大量偽隨機數來盡興某種驗證或者統計
  • 隨機數大家都會用,但是你知道生成隨機數的算法嗎?
    真偽隨機數 當前學界分別真偽隨機數的方法非常簡略,一句話就能說清楚, 但凡用必然的算法應用法式生產的都是偽隨機數 ,經歷物理徵象發生的隨機數才是真隨機數。也即是說計較學家們曾經證實了僅僅寄託算法是無法生產真隨機數的,也能夠以為這是一個NP疑問。
  • 玩轉Python 中的隨機數
    開發中我們經常遇到需要隨機數的場景,比如為了用戶密碼更安全我們有時會加鹽,也就是將用戶原密碼連接上一串隨機字符然後加密保存,又比如我們可能需要隨機展示某張圖片等等。今天,我們就來理一理 Python 中的隨機數的玩法,當然,這裡只涉及標準庫。
  • 抽獎這件事真的是隨機的嗎?
    計算機產生的隨機數,其實是偽隨機 「 pseudorandom 」 ,或者說是模擬出來的隨機數。但現在有很多場景確實需要計算機 「 隨機 」 點兒啥,比如遊戲,抽獎。。。於是。。。就有了各種各樣的,用來讓計算機生成隨機數的偽隨機算法。
  • 詳解Python隨機數的生成
    ,比如密碼加鹽時會在原密碼上關聯一串隨機數,蒙特卡洛算法會通過隨機數採樣等等。注意的是返回的隨機數可能會是 0 但不可能為 1,即左閉右開的區間。num = [1, 2, 3, 4, 5]print("sample: ",random.sample(num, 3))Python 的random模塊產生的隨機數其實是偽隨機數,依賴於特殊算法和指定不確定因素(種子seed)來實現。
  • 量子力學描述的「隨機」是宇宙中唯一真正的「隨機」嗎?
    因為我們無法想像什麼是真正隨機的。我們認為,隨機性是因為我們用太少的信息來推斷為什麼是這樣。  事實上,這個問題已經被問過很多次了。答案總是一樣的,因為作為一個數學模型,量子力學是以概率為解釋,它不同於經典概率。但在某種程度上,如果量子力學是一個隨機近似理論呢?那麼真相在哪裡呢?
  • 進展|基於納米環磁性隧道結的自旋隨機數發生器
    在當今大數據時代,各行各業對隨機數的需求日益增加,例如,通信領域的信息加密、科學研究中的統計模擬、博彩行業的隨機分配、安全領域的隨機密鑰與身份驗證,都離不開隨機數的運用。在理想情況下,隨機數序列應該是一個彼此之間完全獨立的,「0」和「1」(二進位)以相同概率隨機分布的數字串。
  • 利用隨機數完成公司年會抽獎過程
    在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中等等。產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關係。
  • 抽獎真的是隨機的嗎?科學解釋你為什麼沒能成為「中國錦鯉」
    人生反覆無常是沒錯,但是上面由計算機產生的 「 隨機 」 ,真的是反覆無常的嗎?計算機產生的隨機數,其實是偽隨機 「 pseudorandom 」 ,或者說是模擬出來的隨機數。但現在有很多場景確實需要計算機 「 隨機 」 點兒啥,比如遊戲,抽獎。。。於是。。。就有了各種各樣的,用來讓計算機生成隨機數的偽隨機算法。C++ 裡的偽隨機數計算公式這種算法一般是個函數:你輸入一個東西,就會輸出一個東西。
  • 如何製造終極隨機數生成器?只要兩個量子計算機
    隨機數在計算機和密碼學等領域有廣泛的應用,目前已經有了許多生成隨機數的方法。但事實上,任何基於經典力學的過程所產生的隨機數,本質上都不是真隨機的。而量子世界特有性質使得可以從中產生可以驗證的純隨機 (pure random) 數。本文將介紹兩個把量子計算機變成隨機數製造工廠的技術。
  • python隨機模塊22個函數詳解(上)
    作者:小伍哥來源: AI入門學習今天給大家介紹下python中的隨機模塊,隨機數可以用於數學,遊戲,安全等領域中,還經常被嵌入到算法中,用以提高算法效率,並提高程序的安全性。平時數據分析各種分布的數據構造也會用到。
  • 量子隨機數發生器獲得重大突破
    隨機數生成(RNG)用於眾多加密應用中,包括密碼學、數值模擬、賭博和遊戲開發。隨機數是強健而唯一的加密密鑰的核心,這些密鑰用於保護加密操作免遭破壞。RNG還可以增強人工智慧系統的性能。眾所周知,計算機難以生成真正的隨機數,基於軟體的算法實現的隨機數生成器會產生看上去隨機但確定性的數字序列,這帶來了許多信息安全漏洞。