偽隨機數發生器:你不知道,其實計算機並不能產生隨機數

2021-01-15 科技精彩說

在生活中,我們需要用到隨機數的地方很多,例子也很好舉,比如我們買彩票的號碼就是一個隨機數。但是當計算機中需要產生隨機數的時候,絕大多數情況下並不是真的隨機數,我們把它稱為偽隨機數。這些偽隨機數是在一定的數值範圍內,採用一定的算法挑選出了一個數字,作為隨機產生的結果顯示出來,我們只能夠儘量讓這個算法公平一些,讓挑選到範圍內每一個數字的概率儘量做到一樣大,這樣產生的結果會更接近隨機數。

如果大家對編程有一些基礎的話,那麼對於rand()函數或者random()函數就不會陌生,這兩個函數都是用來產生偽隨機數的,要設定一個隨機種子(數值形式)來讓函數產生偽隨機數。雖然我們已經努力儘量讓產生的偽隨機數接近真實隨機數的概率,但是二者還是有本質區別的,最重要的一點區別是真實隨機數不能預測也沒有規律,而偽隨機數一定有規律(只是低級的規律好找,高級的規律不好找)而且可以被預測出來。

能夠被預測這件事對於計算機來說是比較可怕的,因為我們經常使用隨機數的場景是開獎之類的涉及利益和勝負的事情,如果生成偽隨機數那一部分的代碼被隱藏起來還好,遊戲的參與者看不到偽隨機數有什麼規律,也就無法人為操縱。但是針對一些代碼需要公開的情況,偽隨機數的規律性就變得很棘手。就像是最近比較火的區塊鏈技術,如果有人做了一個區塊鏈遊戲,他就不得不把代碼通過白皮書的形式發布出來,生成偽隨機數的部分一定會被玩家仔細研究。

之前有一個區塊鏈開獎的遊戲,玩家支付10元參與遊戲,當有10名玩家參與到遊戲中來的時候,就會隨機開出一個數字,生成區塊的時間跟這個數字最接近的玩家成為贏家,獲得10名玩家支付的一共100元獎勵。如果有人通過研究這個偽隨機數的產生規律,提前預知了下一個開獎數字是什麼,那麼他就可以操控自己在一個很接近的時間付錢進場生成區塊,那麼他就有很大的可能性獲得最後的勝利,得到一筆遠超過投入的財富。

所以偽隨機數在一些情況下不能奏效,我們還需要探索更科學更有效的方法來想辦法把需要公平的問題轉化成別的模式,但是在一些情境下,我們還是需要有偽隨機數來為我們進行一些工作的。我們有很多的算法可以產生偽隨機數,這些算法也各有優劣。最早的一個偽隨機數算法是1946年被計算機歷史上一個很重要也很著名的人——馮·諾依曼提出的平方取中法,選擇一個m位數Ni作為種子做平方運算,在這個數選中間m個位的數作為Ni+1。這個算法執行起來比較簡單,但是也存在著很大弊端,它能夠執行的周期很短,而我們通常認為周期越長隨機性能是越高的,而且如果選中了一些特殊的數字,比如100000,那麼平方的結果中間的m位將始終是000000。

我們也有一些方法來檢驗偽隨機數函數和發生器的隨機性能優劣,我們希望我們產生的偽隨機數具有均勻性,能夠接近真實隨機數各種可能的數值平等地擁有出現的機會,我們希望我們產生的偽隨機數具有獨立性,不能在多個偽隨機數之間產生內在聯繫從而讓別人分析得出偽隨機數產生的規律。但是歸根結底,計算機產生隨機數這件事可能就像是永動機一樣,以我們目前的水平難以完美實現,但是我們無法定論它一定無法實現。

相關焦點

  • 真隨機數發生器在信息安全系統中的應用
    目前最常見的偽隨機數序列產生方法,是基於某一事先確定的序列生成算法(主流偽隨機數生成算法大都是乘/加同餘法及其變體,就是利用整數加法和乘法之間關係的高度不協調),依賴一個由選定的隨機數「種子」來產生隨機序列。這樣生成的偽隨機數,在一般的應用中(主要是模擬計算),已經足夠了。
  • 隨機和偽隨機 電腦隨機數是如何生成的?
    要理解為什麼這種隨機數不太可靠,你必須理解隨機數的生成原理。  隨機數的作用  隨機數的使用歷史已經有數千年。無論是拋硬幣還是搖色子,目的是讓隨機概率決定結果。電腦中的隨機數生成器的目的也是如此——生成隨機不可預測的結果。  加密法要求數字不能被攻擊者猜到,不能多次使用同樣的數字。
  • 單片機C語言如何產生隨機數
    ,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器THX和TLX的值,再加以運算得到一個規定範圍內的隨機數值。 KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。
  • 密碼學的骰子——隨機數
    根據一般定義,隨機數應該具有以下三個性質:隨機性,不存在統計學偏差,是完全雜亂的數列,即分布均勻性和獨立性;不可預測性,不能從過去的隨機數數列推測出下一個出現的數;不可重現性,不能重現相同的數列。像常用到的C語言的rand庫和Java的java.util.Random類,就是採用了線性同餘算法生成隨機數。雖然名字好像不好聽,但偽隨機數已經滿足大多數應用場景的需求了。但對於密碼學來講,偽隨機數就遠遠不夠了。除了隨機性,密碼學要求的隨機數還要具備不可預測性。我們把具有這兩個性質的隨機數叫做密碼學安全的偽隨機數或強偽隨機數。
  • Excel生成隨機數的技巧,隨機數發生器,你用過嗎
    Excel獲取隨機數從概率分布中產生隨機樣本,其基本原理是隨機數的概念。隨機數是均勻分布在0和1之間的數。從技術上講,電腦不能產生真正的隨機數,因為它們必須使用一個可預測的算法。但是,設計用於產生一個數列的算法,似乎是隨機的。在 Excel中,我們可以使用函數RAND()在任何一個單元格之中產生隨機數。
  • 量子真隨機數發生器研究取得進展
    超高速真隨機數發生器簡化設計方案(上)與後處理方法(下)信息科學技術學院郭弘教授課題組與物理學院張建瑋副教授課題組開展合作,在用光學隨機源設計研製量子真隨機數發生器的研究中取得重要進展 近期,郭弘課題組已在真隨機數發生器研究領取得了一系列研究成果。例如,通過對離散型和連續型量子隨機源的持續研究,在隨機源的建模分析、信號採集手段、數據後處理方法和隨機性統計檢測等方面均形成理論和技術的積累。
  • 區塊鏈中隨機數的實現
    當我們談論計算機系統中的隨機性時,我們真正指的是偽隨機性,即儘可能模擬出現實世界應有的隨機性,使之近乎於「真正的隨機性」。以密碼學安全偽隨機數生成器為例,這是一個非常強大的隨機性模擬。隨機數在隱私技術和密碼學中發揮著重要作用。令人驚豔的是,通過生成一個隨機數來對一條消息進行運算(XOR),提供了一種簡單但十分強大的加密方案。
  • 量子保密通信迎新突破 隨機數發生器速率刷新高
    中國電子科技集團4日晚間發布了一款新型高速量子隨機數發生器,量子隨機數實時產生速率大於5.4G比特每秒,極限值突破117G比特每秒,刷新了此前中國科學技術大學團隊68G比特每秒的記錄,成為目前世界上產生速率最高的量子隨機數發生器。量子保密通信迎新突破按照密碼設計的基本原則——「一切秘密寓於密鑰之中」。
  • 利用隨機數完成公司年會抽獎過程
    在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中等等。產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關係。
  • 你知道的抽卡真的是隨機的嗎?
    各位同學有沒有在LOL中帶著百分之50得暴擊率連砍幾刀都不出暴擊呢?還是在打遊戲刷副本的時候遲遲不爆裝備呢,你覺得自己天生就是非酋血統,日常被命運捉弄可你有沒有想過這些被計算機產生的"隨機"事件,也許沒有那麼隨機。
  • ...量子密鑰分發(QKD)而言,隨機數至關重要,關乎量子密鑰的安全...
    宏達新材:全資子公司在產量子隨機數發生器,可用於量子通信;10月19日,上海宏達新材料股份有限公司在互動平臺表示,公司全資子公司上海鴻翥信息科技有限公司目前於量子領域在產的產品有量子隨機數發生器,其可基於量子物理原理產生隨機數,可應用於量子通信、量子信息、傳統信息安全、密碼學、蒙特卡洛模擬、數值計算、隨機抽樣、神經網絡計算等;對於目前主流的量子保密通信技術
  • java生成隨機數的五種方法
    initRNG() 方法是 synchronized 的,因此在多線程情況下,只有一個線程會負責創建偽隨機數生成器(使用當前時間作為種子),其他線程則利用該偽隨機數生成器產生隨機數。因此 Math.random() 方法是線程安全的。
  • 為什麼說《復聯》中隨機抹去一半生命是「偽隨機」
    小侯也是漫威系列電影的愛好者之一,本著雞蛋裡挑骨頭的心理,分析一下滅霸響指的隨機,到底是真隨機,還是偽隨機。一、隨機與偽隨機什麼是隨機?什麼又是偽隨機?隨機,按照通俗一點理解,就是不依照任何規則,自由組合。
  • 在EXCEL中隨機函數的利用
    在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中等等。產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關係。
  • C語言如何產生不重複的隨機數?
    要做到這種效果,我目前找到了兩種算法,一種叫洗牌算法,另一種我也不知道叫什麼名字。n = rand() % 5;s = a[k];a[k] = a[n];a[n] = s;}這種算法就像洗牌一樣打亂順序,在這裡的for循環執行了1000次,就相當於洗牌了1000次,最後把數組a的值從a[0]到a[4]按順序依次輸出就形成了不重複的隨機數
  • 如何製造終極隨機數生成器?只要兩個量子計算機
    隨機數在計算機和密碼學等領域有廣泛的應用,目前已經有了許多生成隨機數的方法。但事實上,任何基於經典力學的過程所產生的隨機數,本質上都不是真隨機的。而量子世界特有性質使得可以從中產生可以驗證的純隨機 (pure random) 數。本文將介紹兩個把量子計算機變成隨機數製造工廠的技術。
  • python隨機模塊22個函數詳解(上)
    random模塊,用於生成偽隨機數,之所以稱之為偽隨機數,是因為真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分布概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是按照一定算法模擬產生的,對於正常隨機而言,會出現某個事情出現多次的情況。