03.03 為什麼有程序員都說取的隨機數是偽隨機數?

亻睹mU536809


偽隨機是指在有限次數內隨機,出現相同的數字。要實現真隨機,小編認為主要把握兩點:



1.種子。種子要選取帶有唯一性的值,如時間。這樣就從源頭避免了偽隨機。

2.算法。只要在有限次數內不重複,就達到了真隨機。因此,算法實現一組隨機數,每個都不同(相同的已拿掉,算法的好壞決定了出現相同數字的概率),這樣應用時再從這組數中取出,就保證了不重複。



隨機數在應用開發中,尤其是遊戲開發中常用,這是個常見的問題,需從種子和算法上著手解決。



謝謝大家。


嵌入式宏思微想


嚴格來說,根本不存在真隨機數,不僅計算機做不到,整個世界都做不到。

我們先聊一下幾種常見的隨機數吧。

第一種是通常大家說的偽隨機數

想起我剛學c語言的時候,經常用到的rand函數,它是個標準偽隨機數生成器。每次運營程序,產生的結果都是一樣的。這種偽隨機數是通過一個確定的隨機數發生器產生的,它僅僅能保證生成很多個數的時候,在統計上趨於均勻分佈。

第二種是通常大家說的接近真隨機的數

它和第一種方法類似,但是可以通過一個變化的種子使得它看起來更隨機。一個常見的用法就是以時間作為種子,這樣就不會出現多次執行程序出現一樣結果的"bug"了,然而,這還是偽隨機,對於確定的種子來說。它還是一個確定的過程

第三種是通常大家說的真隨機數

這種通常是取自物理上的變量,比如大氣汙染指數小數點第5位,白噪聲小數點第3位。看起來足夠隨機了吧。其實它還是確定事件,在確定的外因下,這些物理數據依然是確定的。並且前一秒的數據和後一秒是有關聯的。

我還聽到一個說法,利用量子物理的測不準理論,但其實它還是個確定事件,測不準只是人類的認知有限,從上帝視角來看,根本不存在隨機的說法!


戰神猴哥


家用電腦沒有設置隨機數字發生器電路,所得隨機數是通過查詢一張隨機數表得出的,入口就是所謂的種子,一般用時間秒作為種子,保證短時間內不重複。但這個查表得出的隨機數顯然不夠隨機,你可以用一個循環連續調用rand()函數,會發現短時間內得到的值重複概率極大。而中間插一個延時函數後就能顯著降低重複概率。


切問近思61177173


因為電腦裡面產生隨機數的函數大致是通過電腦某些元件的特徵信息來產生,例如CPU序號,網卡Mac地址,時鐘當前讀數等,再加上每次參與生成的seed種子參數不同,就會生成不同的數。這種算法最大限度地保證了不同計算機上或者相同計算機在不同時間上生成不同的數。 但是最關鍵的事情來了,這個隨機數生成算法其實算出的是一個確定數,或者說是一個可預知的數。只要算法所依賴的特徵一樣,例如CPU序號,Mac地址,時鐘讀數等等,在相同seed情況下,總是得到相同值。這樣就不是隨機數了,而是確定數,因此叫偽隨機數。 最後總結一下,rand()等隨機函數產生的數只能保證在不同機器,不同時間等特徵要素不同時得到不同的值。而這些特徵在計算機世界裡是很容易偽造或者設置為相同的。 同樣的情況是UUID的生成函數,雖然足夠大,號稱可以標註全宇宙的每一個原子,但在人為或者巧合情況下,是很容易重複的。


紅桔2017


因為都是通過一個隨機數生成算法生成的,依賴於種子來產生不同的隨機序列。一般使用時間作為種子,但是如果種子一樣的話,我們就可以得出來一模一樣的隨機數序列。因為算法和入參都確定了。

實際上偽隨機算法如果保證均勻分佈,而且隨機數的種子依賴一些環境上面的不確定的值的話,還是讓人感覺到和真隨機差不多的。


冰封灬飛飛


我用的是c++ 我就以c++為例,在編程中使用隨機數的時候必定要包含特定的函數,比如利用時間產生“隨機數”就必須要包含time.h頭文件,這就導致了 所產生的隨機數其實和時間是有一定的關係的,通過讀取系統的時間,將時間帶入到特定的公式當中,然後產生隨機數是有一定規律存在的,所以稱之為 偽隨機數 當然不止能通過時間來獲取隨機數,還能通過敲擊鍵盤的時間間隔,特定的中斷等產生隨機數,這些隨機數一樣都是存在一定的規律。


紅眼鬥士121


因為你每個隨機數其實都是通過計算得出來的。也就是說可通過公式計算的。那他就不是真正的隨機數。你設置了隨機數種子,只是為這條公式設置一個變量x。讓公式更復雜,但是他還是可計算的。隨機是不可預知計算的。如果要得到真正的隨機數。那就需要給它提供一個隨機參數。骰子的點數當做隨機數種子之類的


觀雲樓


怎樣才叫真隨機?從1-100隨機取,取100次,正好把100個數各取一次?每次的順序還不能相同。但現實裡,很可能是好多數取過好幾次,而有的一次也取不到,這樣才是真實一點的隨機吧。


分享到:


相關文章: