[每日短篇] 17 - 正確使用隨機數 Random

隨機數在系統開發中幾乎是不可避免的一個需求,在大多數面試寶典必定會告訴你所謂的隨機數實際上是「僞」隨機數,除此以外也就沒有什麼別的了。實際上這條知識自己已是很是落後了,更不用說當它仍是正確的時候,用處也並非很大。本篇要提到的正確使用隨機數的要點,是一個比較常見的錯誤,甚至某不僅是世界500強公司也曾經在其產品中出現過這種問題,還改了 2 次才解決問題。面試

從根本上說,一個很是容易犯的錯誤出在對隨機數種子的認識上,指定隨機數種子一種用途是重複產生相同的隨機數序列,另外更經常使用的是但願隨機數序列能夠更隨機一點,避免產生相近的隨機數。實際上如今經常使用的僞隨機數序列是用線性同餘算法生成的,給定一個種子連續計算產生的僞隨機數是均勻分佈的,若是不斷指定新的隨機數種子,會影響到序列的分佈。從隨機數生成算法和種子做用,很容易推導出幾個常犯的錯誤:算法

  1. 不斷指定隨機數種子致使隨機數序列質量不高
  2. 併發編程中併發指定與時間相關的隨機數種子致使多個隨機數發生器產生相同的隨機數序列
  3. 不指定隨機數種子依賴隨機數發生器缺省初始化的隨機數種子,又頻繁建立隨機數發生器,致使隨機數序列質量不高
  4. 不指定隨機數種子依賴隨機數發生器缺省初始化的隨機數種子,缺省初始化的隨機數種子又與時間相關,又頻繁或者併發建立隨機數發生器,致使產生重複的隨機數序列
  5. 併發使用非線程安全的隨機數發生器致使屢次獲取到同一個隨機數

要正確使用隨機數,須要注意如下幾點:編程

  1. 隨機數發生器一旦初始化後應長期重複使用,避免臨時建立隨機數發生器
  2. 若是有併發使用的場景,注意檢查隨機數發生器是不是線程安全的,若是不是則要避免併發或者額外加鎖
  3. 若是但願未來經過相同的隨機數種子重放隨機數序列,從而實現重放業務的目的,要考慮避免併發使用隨機數發生器以避免沒法徹底重複業務處理過程
相關文章
相關標籤/搜索