Java隨機數的幾種有趣用法

2021-02-13 全棧開發者中心

  眾所周知,隨機數是任何一種程式語言最基本的特徵之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數。看似簡單,但有時我們也會忽略了一些有趣的功能。

  我們從書本上學到什麼?

  最明顯的,也是直觀的方式,在Java中生成隨機數隻要簡單的調用:

java.lang.Math.random()

  在所有其他語言中,生成隨機數就像是使用Math工具類,如abs, pow, floor, sqrt和其他數學函數。大多數人通過書籍、教程和課程來了解這個類。一個簡單的例子:從0.0到1.0之間可以生成一個雙精度浮點數。那麼通過上面的信息,開發人員要產生0.0和10.0之間的雙精度浮點數會這樣來寫:

Math.random() * 10

  而產生0和10之間的整數,則會寫成:

Math.round(Math.random() * 10)

  進階

  通過閱讀Math.random()的源碼,或者乾脆利用IDE的自動完成功能,開發人員可以很容易發現,java.lang.Math.random()使用一個內部的隨機生成對象– 一個很強大的對象可以靈活的隨機產生:布爾值、所有數字類型,甚至是高斯分布。例如:

new java.util.Random().nextInt(10)

  它有一個缺點,就是它是一個對象。它的方法必須是通過一個實例來調用,這意味著必須先調用它的構造函數。如果在內存充足的情況下,像上面的表達式是可以接受的;但內存不足時,就會帶來問題。

  一個簡單的解決方案,可以避免每次需要生成一個隨機數時創建一個新實例,那就是使用一個靜態類。猜你可能想到了java.lang.Math,很好,我們就是改良java.lang.Math的初始化。雖然這個工程量低,但你也要做一些簡單的單元測試來確保其不會出錯。

  假設程序需要生成一個隨機數來存儲,問題就又來了。比如有時需要操作或保護種子(seed),一個內部數用來存儲狀態和計算下一個隨機數。在這些特殊情況下,共用隨機生成對象是不合適的。

  並發

  在Java EE多線程應用程式的環境中,隨機生成實例對象仍然可以被存儲在類或其他實現類,作為一個靜態屬性。幸運的是,java.util.Random是線程安全的,所以不存在多個線程調用會破壞種子(seed)的風險。

  另一個值得考慮的是多線程java.lang.ThreadLocal的實例。偷懶的做法是通過Java本身API實現單一實例,當然你也可以確保每一個線程都有自己的一個實例對象。

  雖然Java沒有提供一個很好的方法來管理java.util.Random的單一實例。但是,期待已久的Java 7提供了一種新的方式來產生隨機數:

java.util.concurrent.ThreadLocalRandom.current().nextInt(10)

  這個新的API綜合了其他兩種方法的優點:單一實例/靜態訪問,就像Math.random()一樣靈活。ThreadLocalRandom也比其他任何處理高並發的方法要更快。

  經驗

  Chris Marasti-Georg 指出:

Math.round(Math.random() * 10)

  使分布不平衡,例如:0.0 – 0.499999將四捨五入為0,而0.5至1.499999將四捨五入為1。那麼如何使用舊式語法來實現正確的均衡分布,如下:

Math.floor(Math.random() * 11)

  幸運的是,如果我們使用java.util.Random或java.util.concurrent.ThreadLocalRandom就不用擔心上述問題了。

  Java實戰項目裡面介紹了一些不正確使用java.util.Random API的危害。這個教訓告訴我們不要使用:

Math.abs(rnd.nextInt())%n

  而使用:

  rnd.nextInt(n)

  via:oschina

相關焦點

  • Java 生成隨機數的 5 種方式,你知道幾種?
    方法是 的,因此在多線程情況下,只有一個線程會負責創建偽隨機數生成器(使用當前時間作為種子),其他線程則利用該偽隨機數生成器產生隨機數。Java生成隨機數的幾種高級用法,這篇推薦看一下。 因此 方法是線程安全的。
  • 淺談Java中的幾種隨機數
    眾所周知,隨機數是任何一種程式語言最基本的特徵之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數。看似簡單,但有時我們也會忽略了一些有趣的功能。我們從書本上學到什麼?最明顯的,也是直觀的方式,在Java中生成隨機數隻要簡單的調用:java.lang.Math.random() 在所有其他語言中,生成隨機數就像是使用Math工具類,如abs, pow, floor, sqrt和其他數學函數。
  • java生成隨機數的五種方法
    碰巧generator1 和 generator2 使用相同的種子,導致 generator1 以後產生的隨機數每次都和 generator2 以後產生的隨機數相同。因此可以預測出下一個輸出的隨機數。 You should never use an LCG for security-critical purposes.在注重信息安全的應用中,不要使用 LCG 算法生成隨機數,請使用 SecureRandom。
  • 簡要解析:Java中隨機數生成的代碼實現
    double rand = Math.random();        通過Random類的對象  程序可生成許多不同類型的隨機數字,做法很簡單,只需調用方法nextInt()和nextFloat()即可(也可以調用nextLong()或者nextDouble())。
  • 打工人打工魂,打工的必會java調用python的幾種用法
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】,經微信公眾號授權轉載,如需轉載與原文作者聯繫圖丨pexelsjava調用python的幾種用法(看這篇就夠了)在java類中直接執行python語句準備工作:創建maven工程,結構如下:到官網https://www.jython.org
  • 探索 Java 各種隨機函數
    注意,本教程中的隨機函數均是形參為整形,返回值為區間[0,1)內的單精浮點數的函數。測試均為1~10000的隨機數生成速度測試(1D – 輸入x、2D – 輸入x, y)。更新記錄2016.1.22 – 初稿。2016.1.28(1) – 更新了Wichman-Hill隨機數的算法,修改內容。
  • 隨機數本質,C語言的隨機數與隨機種子
    引言在實際編程中,我們經常會用到隨機數這個概念,其實也是一個偽隨機數,實際上並不是一個真正的隨機數,但是也足夠我們使用了。在C語言中,編寫一些關於遊戲之類的程序時就需要用到隨機數了。同時C語言也提供了一個標準庫裡面一個函數來產生隨機數,而對於隨機數的產生是根據種子(根據一個數值按照某種公式計算的)來變化的,種子 與隨機數之間符合正態分布(高斯分布)。
  • excel隨機數函數是什麼?excel怎樣生成隨機數?
    excel為數據的處理提供了很多函數,今天小編要介紹的是excel隨機數函數,以及隨機數函數的用法,希望對大家有所幫助!excel隨機數二、excel隨機數函數excel中常用的隨機數函數有兩個它們雖然都是用來生成隨機數的,但是它們的用法和生成的隨機數是不同的。接下來我們就一起來看看RAND()函數和RANDBETWEEN()函數的具體用法吧!1、RAND()函數在excel中,RAND()函數通常是使用來生成0-1之間的小數隨機數。
  • 單片機隨機數:rand(),srand()
    順手些了幾個函數,作為擴展。C不支持可變參數,也不支持overloard,所以只能用不同的函數名稱表示。當然也可以傳入個hash的數據結構作為參數(ruby like)。通常的做法是以這樣一句代碼srand((unsigned) time(NULL));來取代,這樣將使得種子為一個不固定的數, 這樣產生的隨機數就不會每次執行都一樣了。
  • @Pointcut 的 12 種用法,你知道幾種?
    本文主要內容:掌握@Pointcut的12種用法。
  • numpy產生隨機數匯總
    random()產生的隨機數的分布非均勻分布,numpy.random.rand()產生的隨機數的分布為均勻分布。np.random.random((3,3))  ##產生一個[0,1)之間的形狀為(3, 3)的數組。
  • 密碼學的骰子——隨機數
    根據一般定義,隨機數應該具有以下三個性質:隨機性,不存在統計學偏差,是完全雜亂的數列,即分布均勻性和獨立性;不可預測性,不能從過去的隨機數數列推測出下一個出現的數;不可重現性,不能重現相同的數列。我們在平時編程開發裡用到的隨機數,一般都只滿足第一個條件,這種只滿足隨機性分布的隨機數,就叫做偽隨機數或弱偽隨機數。這是因為程式語言提供的隨機數生成方法(學名叫偽隨機數生成器)是靠軟體算法實現的,既然是算法,那就必定遵循了一定的規律,也就有被預測的可能。
  • 幾種常見的隨機事件概率模型
    隨機事件的概率問題是近幾年高考中重點考查的內容之一,掌握這一問題的求法,有助於同學們對概率這一章的學習,下面從常見的幾種模型出發來探討一下此類題目的求法。種,於是P(B)=三、取數問題模型取數問題是概率問題的一個重要的模型,解決這一類題的關鍵在於要分清在取數的過程中有無順序,取完數後是否將數放回,另外要注意所取的數是否可以重複選取。
  • java常用幾大類庫
    輸出數據System.out.println("i:"+i);}}第3章 Random類3.1 什麼是Random類此類的實例用於生成偽隨機數。例如,以下代碼使用戶能夠得到一個隨機數:Random r = new Random();int i = r.nextInt();3.2 Random使用步驟查看類java.util.Random :該類需要 import導入使後使用。
  • java.util.Scanner的幾種next方法
    java.util.Scanner,這個類,想必大家都不怎麼陌生,在初學Java這門程式語言時,都見過,使用過吧。今天就來說說java.util.Scanner類的幾種next方法。scanner.nextBigDecimal()方法如果想要通過java.util.Scanner來獲取一個輸入的BigDecimal對象,則可以使用類似下面示例的代碼。
  • C++ 隨機數初探
    C++11種引入了新的隨機數接口,我們一起來看看吧。rand 函數有一些問題:即使不是大多數,也有很多程序需要不通範圍的隨機數。一些應用需要隨機浮點數。一些程序需要非均勻分布的隨機數。而在編寫程序為了解決這些通常會轉換 rand 生成的隨機數的範圍、類型或者是分布時,常常會引入非隨機性。
  • 【編程基礎】C語言產生隨機數需要了解的幾個函數
    C語言產生隨機數是一個常見的編程功能任務,當然這個也不難,調用兩三個函數就出來了,但是你知道這些函數具體是起到怎樣的作用,並且是它們是如何產生隨機數的嗎?幾個概念隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。
  • 隨機數生成
    如利用蒙特卡羅法估計測量數據的不確定時,就需要使用隨機數生成器來傳遞分布。本書中大量的例子都用到了示例數據,創建這些數據就利用了隨機數生成器。Igor具有強大的統計分析功能,提供了大量函數和命令,用於分布計算、參數估計、假設檢驗、回歸分析等。其中僅偽隨機數生成器就有12種,可以生成滿足常見分布要求的隨機數,如二項分布隨機數、均勻分布隨機數、高斯分布隨機數、洛倫茲分布隨機數等。
  • Excel排序的13種用法,你知道幾種?
    今天,小汪老師來給大家分享一下,關於Excel排序的13種用法,看看你會幾種?
  • 應用matlab實現幾種常見概率分布隨機數的產生
    隨機數:是專門的隨機試驗的結果。在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中,或者在進行蒙特卡羅模擬法計算的時候等等。1.二項分布隨機數的產生程序如下:clear all;clcr=binornd(10,0.5) %在二項分布中n=10,p=0.5R=binornd(10,0.5,3,4) %產生一個