Java如何生成隨機數?要不要瞭解一下!

来源:https://www.cnblogs.com/coding-rocket/archive/2023/05/24/17428509.html
-Advertisement-
Play Games

我們在學習 Java 基礎時就知道可以生成隨機數,可以為我們枯燥的學習增加那麼一丟丟的樂趣。本文就來介紹 Java 隨機數。 ...


前言

我們在學習 Java 基礎時就知道可以生成隨機數,可以為我們枯燥的學習增加那麼一丟丟的樂趣。本文就來介紹 Java 隨機數。

一、Random類介紹

在 Java 中使用 Random 工具類來生成隨機數,該類在 java.util 包下,在 JDK1.0 版本就存在了。Random 單詞本身就是隨機、隨意、任意的意思。Random 是一個普通類,所以在使用時需要創建 Random 對象,在調用其提供的方法。

public class Random implements java.io.Serializable {}

Random 類提供了諸多方法,如下圖:
Random類中方法

二、Random類生成隨機數

1.生成隨機數

在 Java 中,可以使用 java.util.Random 類來生成隨機數。 Random 類提供了多個方法來生成不同種類的隨機數,例如 nextInt()nextDouble() 等。

我們這裡演示如何生成一個介於0到9之間的隨機整數:

import java.util.Random;

public class RandomTest {
    public static void main(String[] args) {
        // 創建Random實例
        Random random = new Random();
        // 生成0到9之間的隨機數
        int randomNum = random.nextInt(10); 
        System.out.println(randomNum);
    }
}

在上面的示例代碼中,首先創建了一個 Random 對象,然後使用 nextInt() 方法生成一個介於0到9之間的隨機整數,並將結果列印到控制臺上。

2.nextInt()方法

nextInt(int bound) 方法是 Random 類的一個實例方法,它用於生成一個介於0(包括0)和指定值(不包括該值)之間的隨機整數。

我們之前使用 nextInt(int bound) 方法生成 0-9 之間的隨機數:

Random random = new Random();
int randomNum = random.nextInt(10);
System.out.println(randomNum);

代碼中使用 Random 類的預設構造函數創建一個隨機數生成器對象,然後調用 nextInt(int bound) 方法生成介於 0(包括 0)和 10(不包括 10)之間的隨機整數(多次提及且加粗),最後將結果存儲到 randomNum 變數中並列印到控制臺上。

這個方法的實現原理是根據隨機數生成器的內部狀態生成隨機數。如果指定的 bound 參數是正數,則生成的隨機數即為 0 到 bound 之間的某個整數。如果 bound 是負數或者 0,則會拋出 IllegalArgumentException 異常。需要註意的是,生成的隨機數是偽隨機數,其實際上是一個確定性的函數,但是它的表現看上去是隨機的。

對於 Random.nextInt(int bound) 方法,需要特別註意 bound 參數的取值範圍。如果生成的隨機數不是 0 到 bound 之間,那麼就可能會對一些應用產生負面影響,比如在密碼學應用中可能會導致漏洞。因此,在使用該方法時,需要仔細檢查 bound 參數的取值範圍,並對其進行適當的限制。

那麼除了 nextInt() 方法,還有 nextLong()nextBoolean()nextFloat()nextDouble() 等。

三、使用場景

Java 隨機數生成器可以在很多場景下使用,比如在游戲開發中,可以隨機生成怪物、地圖、道具等;如果涉及密碼,可以在加密過程中需要生成隨機數,如在生成密鑰的時候生成長度隨機的鹽值;也可以進行測試和演練:可以使用隨機數生成器來生產測試數據、觀測數據等等;

總之,隨機數的使用非常廣泛,任何需要模擬隨機的場景都可以使用 Java 提供的隨機數生成器生成隨機數。

我們大都有選擇困難症,比如不知道午飯吃什麼?很頭疼!那就讓上天來決定吧!我們使用 Java 隨機數來隨意抽取或是決定午飯。

import java.util.Random;

public class RandomLunch {
    public static void main(String[] args) {
        String[] foods = {"漢堡", "炸雞", "披薩", "烤肉", "牛肉麵", "米線", "酸菜魚", "煲仔飯", "火鍋", "小籠包"}; //可以選擇的午餐品種
        Random random = new Random();
        int index = random.nextInt(foods.length); // 生成0到可選菜品數量之間的一個隨機整數
        String lunch = foods[index]; // 根據隨機數選定菜品
        System.out.println("午飯吃" + lunch);
    }
}

上面的代碼中,首先定義了一個數組中,存儲了可以選擇的午餐品種。然後使用 java.util.Random 類創建一個隨機數生成器對象,使用 nextInt(int bound) 方法生成一個介於 0 和可選菜品數量之間的隨機數。最後,使用這個隨機數從菜品數組中選擇一個菜品,將其存儲到字元串變數 lunch 中,並輸出午餐的選擇結果。

在實際開發中,可以將類似的代碼集成到提供菜品選擇功能的系統中,方便辦公室的小伙伴們快速決定午餐。

四、官方提示

java.util.Random 的實例是線程安全的。但是,跨線程併發使用同一個 java.util.Random 實例可能會遇到爭用,從而導致性能下降。考慮在多線程設計中使用 java.util.concurrent.ThreadLocalRandom

java.util.Random 的實例不是加密安全的。請考慮使用 java.security.SecureRandom 來獲得加密安全的偽隨機數生成器,以供對安全性敏感的應用程式使用。

總結

Java 隨機數的使用場景還是很多的,所以我們要對其進行掌握,本文對 Java 生成隨機數的類 Random 進行了簡單介紹,如果想深入瞭解,要查看其源碼,去實操,去探究。


關註公眾號:編程火箭車
我們定期發佈編程相關的文章、資訊、活動等內容。幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎。歡迎大家關註,和我們一起探索編程的精彩世界。

本文來自博客園,作者:Ongoing蝸牛,轉載請註明原文鏈接:https://www.cnblogs.com/coding-rocket/p/17428509.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # Java語法基礎 ## 註釋 註釋是對代碼的解釋和說明文字,可以提高程式的可讀性,因此在程式中添加必要的註釋文字十分重要。Java中的註釋分為三種: 單行註釋。單行註釋的格式是使用//,從//開始至本行結尾的文字將作為註釋文字。 ~~~java // 這是單行註釋文字 ~~~ 多行註釋。多行註釋 ...
  • ## 教程簡介 Apache Kafka由Scala寫成。Kafka最初是由LinkedIn開發,並於2011年初開源。2012年10月從Apache Incubator畢業。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平臺。 Kafka是一個分散式的、分區的、多複本的日誌提交服務。它 ...
  • 最近在壓測一批介面,發現介面處理速度慢的有點超出預期,感覺很奇怪,後面定位發現是資料庫批量保存這塊很慢。 這個項目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我點進去看了下源碼,感覺有點不太對勁: 繼續追蹤了下,從這個代碼來看,確實是 ...
  • # 圖紙管理系統 ## 一、初步構建後端項目 ### 1、打開已經創建好的虛擬環境:激活activate(推薦使用虛擬環境)並創建項目 ![](https://img2023.cnblogs.com/blog/2240937/202305/2240937-20230524164953360-1300 ...
  • ### StringIO和BytesIO 很多時候,數據讀寫不一定是文件,也可以在記憶體中讀寫。StringIO就是在記憶體中讀寫str。 要把str寫入StringIO,我們需要先創建一個StringIO,然後,像文件一樣寫入即可: ```python >>> from io import Strin ...
  • # 二、Java開啟非同步的兩種方式 ## 1、註解開啟:==@Async== ### 1.1、配置非同步的線程池 - 必須配置非同步線程池,否則非同步不會生效。 - @EnableAsync 註解:指定非同步線程池。不指定預設使用:SimpleAsyncTaskExecutor線程池 - SimpleAsy ...
  • 摘要:這篇文章將詳細講解圖像形態學知識,主要介紹圖像腐蝕處理和膨脹處理。 本文分享自華為雲社區《[Python從零到壹] 四十七.圖像增強及運算篇之腐蝕和膨脹詳解》,作者: eastmount 。 一.形態學理論知識 數學形態學的應用可以簡化圖像數據,保持它們基本的形狀特征,並出去不相干的結構。數學 ...
  • 親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...