關於真隨機數和偽隨機數 - 程式人生

文章推薦指數: 80 %
投票人數:10人

真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。

這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是 ... 程式人生>>關於真隨機數和偽隨機數 關於真隨機數和偽隨機數 阿新••發佈:2019-01-01 來自知乎上@納米黑客的回答: 首先,「真隨機」也有不同的含義,真正的真隨機目測只有量子力學了……一般的所謂真隨機不是指這個,而是指統計意義上的隨機,也就是具備不確定性,可以被安全的用於金融等領域,下面的真隨機也均指這個。

答案是,計算機理論上可以產生統計意義上的真隨機數。

大部分程式和語言中的隨機數(比如C中的,MATLAB中的),確實都只是偽隨機。

是由可確定的函式(比如線性同餘),通過一個種子(比如時鐘),產生的偽隨機數。

這意味著:如果知道了種子,或者已經產生的隨機數,都可能獲得接下來隨機數序列的資訊(可預測性)。

直觀來想,計算機是一種可確定,可預測的的裝置,想通過一行一行的確定的程式碼自身產生真隨機,顯然不可能。

但是,我們或許可以迂迴一下…… 一個典型的例子就是UNIX核心中的隨機數發生器(/dev/random),它在理論上能產生真隨機。

即這個隨機數的生成,獨立於生成函式,或者說這個產生器是非確定的。

實現方法呢?簡單的講就是軟硬結合,或者說,引入系統外的變數(把軟體,程式碼,演算法想象成一個封閉的系統)。

具體來講,UNIX維護了一個熵池,不斷收集非確定性的裝置事件,即機器執行環境中產生的硬體噪音來作為種子。

比如說:IO請求的響應時間,特定硬體中斷的時間間隔,鍵盤敲擊速度,滑鼠移動速度,甚至周圍的電磁波等等……直觀的說,你每按一次鍵盤,動一下滑鼠,鄰居家wifi訊號強度變化,磁碟寫入速度,等等訊號,都可能被用來生成隨機數。

更具體的,核心提供了向熵池填充資料的介面 比如滑鼠的就是 voidadd_mouse_randomness(__u32mouse_data) 核心子系統和驅動呼叫這個函式,把滑鼠的位置和中斷間隔時間作為噪音源填充進熵池。

Q有的中斷有規律可循,或者可以受外界控制,怎麼辦 A並非所有的中斷都能作為噪音源的。

所以,結論是,程式和演算法本身不能產生真隨機,但是計算機系統作為整體可以迂迴產生統計意義上的真隨機。

參考: 核心原始碼在/drivers/char/random.c Windows中也有相對的隨機數生成器,基本的思想是一致的 如果要求更高的話,也有專用的裝置,可收集附近的電磁場等環境噪音來產生隨機數 有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。

有限狀態機不能產生真正的隨機數的,所以在現在的計算機中並沒有一個真正的隨機數生成演算法,現有的隨機數生成演算法生產的隨機數只不過因為重複的週期比較大,可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,一般稱作叫偽隨機數發生器。

真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。

這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。

真隨機數生產效率沒有偽隨機數高,還有就是”資訊熵的資訊量如果很有限的話,就不是一定是真的隨機數了。

” 還有人質疑真正的隨機數的存在,這是哲學問題,不在此涉及。

查了下現有的真隨機數生成器,比如PuTTYgen的隨機數是讓使用者移動滑鼠達到一定的長度,之後把滑鼠的運動軌跡轉化為種子;Intel通過電阻和振盪器來生成熱噪聲作為資訊熵資源;Unix/Linux的dev/random和/dev/urandom採用硬體噪音生成隨機數;(待補充) 基於特定Intel晶片組中randomnumbergenerator(RNG)單元的真隨機數生成器.在Intel815E晶片組的個人電腦上安裝IntelSecurityDriver(ISD)後,可以通過程式設計讀取暫存器獲取RNG中的隨機數. 有人在BBS上提到:RSA的書上介紹過一種隨機數發生器,根據的是劣質記憶體晶片工作在高溫下,其資料是不可預測的,讀取這裡面的資料,就會得到難以預測的隨機數。

有采用這種技術製作隨機數發生器板卡。

關於Linux系統的真隨機數生成器在《Linux核心設計與實現》一書的附錄B中有詳細介紹 Linux自1.3.30版就在核心提供了真隨機數生成器,至少是理論上能產生真隨機數,它利用機器的噪音生成隨機數,噪音源包括各種硬體執行時速,使用者和計算機互動時速。

比如擊鍵的間隔時間、滑鼠移動速度、特定中斷的時間間隔和塊IO請求的響應時間等。

此外還有提供真隨機數的網站,如: 1。

http://random.irb.hr/是一個免費為學術和科研機構提供真隨機數字服務的網站。

全名是QuantumRandomBitGeneratorService(QRBGS),由克羅埃西亞的電腦科學家開發。

其隨機性依賴於半導體光子發散量子物理過程中內在的隨機性,光子通過光電效應進行檢測。

這些隨機檢測到的光子都是相互獨立的。

可以通過C/C++庫、WebService、Mathmatic/Matlab外掛等多種方式訪問。

將來會提供基於SSL的安全訪問。

它甚至還有個小小的Erlang的客戶端訪問程式 http://code.google.com/p/qrbgerl/ 還有http://random.org/,從1998年開始就在Internet上提供真隨機數服務了,它用大氣噪音生成真隨機數 有人還提到 用Java可以使用java.security.SecureRandom產生真隨機數(待查); Linux系統有/dev/random,/dev/urandom向用戶提供真隨機數; Windows系統有CryptGenRandom函式生成真隨機數(待查) 在《數字追凶numb3rs》第6季中有一集是通過預測彩票所採用的偽隨機數演算法進行彩g票f詐w騙的。

2010年,德國研究人員開發出一種產生真隨機數的新方法,他們希望能改進網際網路安全。

隨機數是計算機和網際網路安全的重要組成部分,網站和瀏覽器利用一把會話鑰匙加密兩者之間傳送的資料。

偽隨機數可以預測和破解,研究人員一直在研究能產生真正的、無法預測的隨機數方法。

德國的研究團隊現在開發出一種真隨機數發生器,它使用的計算機記憶體雙態觸發器作為隨機的一個額外層,觸發器可隨機的在1或0狀態中切換,在切換之前,觸發器處於行為無法預測的“亞穩態”。

在亞穩態結束時,記憶體中的內容為完全隨機。

研究人員對一個觸發器單元陣列的實驗顯示,這種方法產生的隨機數比傳統方法“隨機”約20倍。

經典物理學不存在真正的隨機性,而量子世界從本質上講就是真正隨機的,是不可預測的。

根據發表在2010年4月最新一期《自然》雜誌上的報告,比利時物理學家S.Pironio和同事利用“遠距離的幽靈般作用”創造出了真隨機數。

2011年,加拿大渥太華的物理學家BenSussman利用鐳射脈衝和鑽石創造了真隨機數。

用真隨機數編碼的資訊將難以被黑客破解。

Sussman的實驗室使用持續幾萬億分之一秒的鐳射脈衝照射鑽石,鐳射進入和出來的方向發生了變化。

Sussman稱改變與量子真空漲落的相互作用有關,量子力學與大多數物理學法則不同,不可能知道真正發生了什麼。

他認為這可以用於創造真正的隨機數。

2012年,史上最快的隨機數生成器:從真空中的亞原子噪音獲取隨機數 量子力學告訴我們亞原子對會持續自發的產生和湮滅,即使是在真空裡也一樣。

通過監聽真空內亞原子粒子量子漲落產生的噪音,澳大利亞國立大學的科學家們建造了世界上最快的隨機數發生器。

研究小組開發了可以通過鐳射監聽真空中隨機噪音的工具並以此產生真正的隨機數。

隨機數生成網頁 DOTA裡斧王的反擊螺旋等採用的是偽隨機。











Maven專案中使用自己下載的jar包,Maven私服裡新增自己下載的jar包。

«上一篇 【SSH框架實現】Struts2【1】最簡單完整例項-IDEA下一篇» 相關推薦 關於真隨機數和偽隨機數 來自知乎上@納米黑客的回答: 首先,「真隨機」也有不同的含義,真正的真隨機目測只有量子力學了……一般的所... 隨機數:真隨機數和偽隨機數 說到隨機這個詞,相信各位肯定都深有體會了。

生活中有太多的不確定因素從各方各面影響著我們,但也正是因為這樣我們的人生更加多彩,具... 關於Java的引用和函式引數傳遞 Java中沒有了指標,這有時給程式設計師帶來了些許不便。

Java的語言設計者強調,這種不便可以通過Java的引用特性得到彌補。

... 關於js的閉包和匿名函數 執行clas為什麽objlog返回內部聲明案例關於js閉包。

之前我一直以為是匿名函數,以為封閉式的創建即執... 最透徹的關於“隨機數種子”和“偽隨機數”的產生原理 //rand04.cpp #include #include usingnamespacestd... 一個隨機數發生器用於在服務器和客戶機直接進行安全性驗證的類 提供服務instancedigext隨機個數相關algorithmsso在服務器向客戶端提供服務時有可能... 關於真機除錯時提示“xxxisbusy:Processingsymbolfiles"和"xcodewillcontinuewhenxxxisfinished" 原文地址::https://www.jianshu.com/p/fdbe7ec1ec44   相關文章 1、Xcode真機除錯裝... 關於c語言rand產生隨機數相同的問題(學習筆記) 函式rand是真正的隨機數生成器(可以產生從0到32767的隨機數),而srand會設定供rand使用的隨機數種子。

呼叫ran... 關於django新手跨站偽造保護機制 bspimgwidth機制tin關於技術分享裏的wid第一種方法: 禁用settings裏的 第二種... 關於Oracle中sys、system和Scott用戶下的數據庫連接問題 連接constrstasysoraclecotconnnagsystem默認:manager sys默... 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 最近訪問 關於真隨機數和偽隨機數 Spring+Boot+整合mybaits+org.apache.ibatis.binding.BindingException Amazon+Web+Services+上的媒體與娛樂 教師評職好訊息來了:2018年教師職稱試點改革 使用timeout-decorator為python函式任務設定超時時間 scrapy中間鍵如何使用代理IP和使用者代理 MyBatis學習三:SqlMapConfig.xml屬性和sql片段 jquery中ajax跨域設定http+header JavaScript++Cookie Debian伺服器之安裝openssh+7.9p1



請為這篇文章評分?