電腦中的隨機數是怎麼生成的硬體方面的原理

2021-03-04 06:42:26 字數 3913 閱讀 7042

1樓:匿名使用者

偽隨機數的生成方法

一般地,偽隨機數的生成方法主要有以下3種[6]:

(1) 直接法(direct method),根據分布函式的物理意義生成。缺點是僅適用於某些具有特殊分布的隨機數,如二項式分布、泊松分布。

(2) 逆轉法(inversion method),假設u服從[0,1]區間上的均勻分布,令x=f-1(u),則x的累計分布函式(cdf)為f。該方法原理簡單、程式設計方便、適用性廣。

(3)接受拒絕法(acceptance-rejection method):假設希望生成的隨機數的概率密度函式(pdf)為f,則首先找到乙個pdf為g的隨機數發生器與常數c,使得f

[偽隨機數發生器]

偽隨機數發生器

(x)≤cg(x),然後根據接收拒絕演算法求解。由於演算法平均運算c次才能得到乙個希望生成的隨機數,因此c的取值必須盡可能小。顯然,該演算法的缺點是較難確定g與c。

因此,偽隨機數生成器(prng)一般採用逆轉法,其基礎是均勻分布,均勻分布prng的優劣決定了整個隨機數體系的優劣[7]。下文研究均勻分布的 prng。

隨機數的「廬山真面目」

首先需要宣告的是,計算機不會產生絕對隨機的隨機數,計算機只能產生「偽隨機數」。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。

偽隨機數並不是假隨機數,這裡的「偽」是有規律的意思,就是計算機產生的偽隨機數既是隨機的又是有規律的。怎樣理解呢?產生的偽隨機數有時遵守一定的規律,有時不遵守任何規律;偽隨機數有一部分遵守一定的規律;另一部分不遵守任何規律。

比如「世上沒有兩片形狀完全相同的樹葉」,這正是點到了事物的特性,即隨機性,但是每種樹的葉子都有近似的形狀,這正是事物的共性,即規律性。從這個角度講,你大概就會接受這樣的事實了:計算機只能產生偽隨機數而不能產生絕對隨機的隨機數。

(嚴格地說,這裡的計算機是指由馮諾依曼思想發展起來的電子計算機。而未來的量子計算機有可能產生基於自然規律的不可重現的「真」隨機數)。

電腦取隨機數是什麼原理,是真正的隨機數嗎

2樓:匿名使用者

首先,「真隨機

」也有不同的含義,若想要「真正的真隨機」目測只能靠量子力學了。一般的所謂真隨機不是指這個,而是指統計意義上的隨機,也就是具備不確定性,可以被安全的用於金融等領域,下面說的也是這種。

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

大部分程式和語言中的隨機數(比如 c 中的,matlab 中的),確實都只是偽隨機。是由可確定的函式(常用線性同餘),通過乙個種子(常用時鐘),產生的偽隨機數。這意味著:

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

直觀來想,計算機是一種可確定,可**的的裝置,想通過一行一行的確定的**自身產生真隨機,顯然不可能。但是,我們或許可以迂迴一下……

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

乙個典型的例子就是 unix 核心中的隨機數發生器(/dev/random),它在理論上能產生真隨機。即這個隨機數的生成,獨立於生成函式,這時我們說這個產生器是非確定的。

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

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

更具體的,核心提供了向熵池填充資料的介面:

比如滑鼠的就是

void add_mouse_randomness(__u32 mouse_data)

核心子系統和驅動呼叫這個函式,把滑鼠的位置和中斷間隔時間作為噪音源填充進熵池。

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

參考:核心原始碼在/drivers/char/random.c

windows 中也有相對的隨機數生成器,基本的思想是一致的

如果要求更高的話,也有專用的裝置,可收集附近的電磁場等環境噪音來產生隨機數

3樓:go蔡依林我愛你

是真正的隨機數。實現這

一功能的程式叫偽隨機數發生器。

不管用什麼方法實現隨機數發生器,都必須給它提供乙個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數暫存器或移位暫存器來生成的。

4樓:匿名使用者

當然不是,只能作一般隨機數用

電腦是否能產生真隨機數?

5樓:永恆刺客

計算機理論上可以產生統計意義上的真隨機數 。首先,「真隨機」也有不同的含義, 真正的真隨機目測只有量子力學了……一般的所謂真隨機不是指這個,而是指 統計意義 上的隨機,也就是具備不確定性,可以被安全的用於金融等領域,下面的真隨機也均指這個。

大部分程式和語言中的隨機數(比如 c 中的,matlab 中的),確實都只是 偽隨機 。是由可確定的函式(比如線性同餘),通過乙個種子(比如時鐘),產生的偽隨機數。這意味著:

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

直觀來想,計算機是一種可確定,可**的的裝置,想通過一行一行的確定的**自身產生真隨機,顯然不可能。但是, 我們或許可以迂迴一下 ,乙個典型的例子就是 unix 核心中的隨機數發生器(/dev/random),它在 理論上能產生真隨機 。即這個隨機數的生成,獨立於生成函式,或者說這個產生器是非確定的。

實現方法:簡單的講就是軟硬結合,或者說,引入系統外的變數(把軟體,**,演算法想象成乙個封閉的系統)。具體來講,unix 維護了乙個 熵池 ,不斷收集非確定性的裝置事件,即機器執行環境中產生的 硬體噪音 來作為種子。

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

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

6樓:元戎劍

目前由計算機產生的所有所謂的隨機數都是偽隨機數.

採用隨機變化的種子再產生偽隨機數,得到的結果更隨機些,但它還是偽隨機數. 因為如果重複這個過程(給同樣值的種子),得到的結果是重複的(同樣的).

如果不採用隨機變化的種子,單用rand(),它只會產生固定的序列.例如: for(i=0;i<10;i++)printf("%d ",rand()); 每次執行輸出的還是那十個數.

談隨機數的分布,涉及統計的概念,統計的前提是要有大量的樣品.做到大量樣品的分布滿足某種分布(包括均勻分布或某種譜分布),演算法上是不困難的.

我們在實驗室裡模擬天然海浪,讓海浪符合設定的頻譜和方向譜,還要滿足波高和週期的時域統計分布,還有波群統計相似,單靠計算機提供的偽隨機數是不夠的,須要加上自己的演算法,才能同時滿足頻域和時域的要求.

"我只要知道偽隨機數用的是哪種演算法,就能準確的知道下乙個數將是什麼",是對的,例如用時間做種子,你只要給入同樣的時間,就能得到同樣的結果.

7樓:陽光上的橋

隨機數是不可能的,都是偽隨機數。

但是隨機數與你說的摩擦、碰撞有關係嗎?

8樓:

計算機可以生成真隨機數,這是由於其在進行硬體驅動時,不可避免的受到不確定因素的影響而產生隨機性,例如計算機至少需要顯示驅動和發聲驅動吧,體現在計算機程式語言上就是涉及顯示卡驅動和音效卡驅動的程式設計函式有的執行時間是隨機的,即使你連續呼叫這些函式執行時間也是變化的,利用這些就可以生成真隨機數了。其它方法也不少就不多說了。

怎麼用c 生成指定隨機數,在c 裡怎麼弄隨機數?

include include include using namespace std int main srand unsigned time null 初始化時間種子 int ret rand 3 產生 0 1 2 三種隨機數 int real pow 2,ret 2的0次方 1 2的1次方2 ...

C 生成0 100之間的隨機數怎麼都是

include include include using namespace std int main for i 0 i 3 i 這個是不行的!還有你的程式,我改過啦!你在看一下!參自見如下 include include include void main 的隨dao機數 拜託,你的輸出怎麼搞...

matlab生成124的隨機數組,1,2,3,4,5,6,7,跪求

你都給了數了,就不叫隨機了。a 1 ones 1,3 2 ones 1,4 3 ones 1,2 4 ones 1,3 5 ones 1,5 6 ones 1,4 7 ones 1,3 matlab如何生成這樣的矩陣 矩陣為1行254列,由1,2,3,4,5,6,7這幾個數字組成,組成規則是 x,y...