java Random 详解

news2024/11/21 21:08:22

Java Random 类详解

Java 提供了 java.util.Random 类用于生成伪随机数。它是基于随机种子(seed)生成伪随机数序列的工具,广泛应用于游戏开发、模拟、算法测试等领域。


Random 类的特性

  1. 伪随机数

    • Random 生成的数是伪随机数,依赖于内部的随机种子。
    • 给定相同的种子,每次生成的随机数序列相同。
  2. 支持多种类型随机数

    • 支持生成 intlongfloatdoubleboolean 等类型的随机数。
  3. 线程安全性

    • Random 是线程安全的,但如果多个线程频繁调用可能会导致性能瓶颈(推荐使用 ThreadLocalRandom)。
  4. 种子控制

    • 可以通过自定义种子生成可预测的随机数序列,便于测试和调试。

构造方法

1. Random()
  • 默认构造函数。
  • 使用当前时间作为种子。
2. Random(long seed)
  • 使用指定的种子初始化随机数生成器。

示例

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        // 使用默认种子
        Random random1 = new Random();
        System.out.println(random1.nextInt());

        // 使用指定种子
        Random random2 = new Random(12345);
        System.out.println(random2.nextInt());
    }
}

常用方法

1. nextInt()
  • 生成一个伪随机的 int 类型数值。
  • 范围:Integer.MIN_VALUEInteger.MAX_VALUE
Random random = new Random();
int randomInt = random.nextInt();
System.out.println(randomInt); // 输出一个随机整数
2. nextInt(int bound)
  • 生成一个伪随机的 int 类型数值,范围为 [0, bound)
  • 参数 bound 必须为正整数,否则抛出 IllegalArgumentException
Random random = new Random();
int randomInt = random.nextInt(10); // 生成 0 到 9 之间的随机数
System.out.println(randomInt);
3. nextDouble()
  • 生成一个伪随机的 double 类型数值。
  • 范围:[0.0, 1.0)
Random random = new Random();
double randomDouble = random.nextDouble();
System.out.println(randomDouble); // 输出 0.0 到 1.0 之间的随机数
4. nextFloat()
  • 生成一个伪随机的 float 类型数值。
  • 范围:[0.0, 1.0)
Random random = new Random();
float randomFloat = random.nextFloat();
System.out.println(randomFloat);
5. nextBoolean()
  • 生成一个伪随机的布尔值(truefalse)。
Random random = new Random();
boolean randomBoolean = random.nextBoolean();
System.out.println(randomBoolean); // 输出 true 或 false
6. nextLong()
  • 生成一个伪随机的 long 类型数值。
  • 范围:Long.MIN_VALUELong.MAX_VALUE
Random random = new Random();
long randomLong = random.nextLong();
System.out.println(randomLong); // 输出一个随机长整型数
7. nextBytes(byte[] bytes)
  • 填充一个字节数组,使其每个字节都是随机值。
Random random = new Random();
byte[] byteArray = new byte[5];
random.nextBytes(byteArray);
System.out.println(Arrays.toString(byteArray)); // 输出随机字节数组
8. setSeed(long seed)
  • 设置随机数生成器的种子。
  • 重置种子后,随机数序列将重新生成。
Random random = new Random();
random.setSeed(12345);
System.out.println(random.nextInt()); // 输出固定的随机数序列

示例应用

1. 模拟掷骰子
import java.util.Random;

public class DiceRoll {
    public static void main(String[] args) {
        Random random = new Random();
        int diceRoll = random.nextInt(6) + 1; // 生成 1 到 6 的随机数
        System.out.println("You rolled: " + diceRoll);
    }
}
2. 随机密码生成器
import java.util.Random;

public class PasswordGenerator {
    public static void main(String[] args) {
        Random random = new Random();
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder password = new StringBuilder();

        for (int i = 0; i < 8; i++) { // 生成8位密码
            int index = random.nextInt(characters.length());
            password.append(characters.charAt(index));
        }

        System.out.println("Generated password: " + password);
    }
}
3. 抽奖程序
import java.util.Random;

public class Lottery {
    public static void main(String[] args) {
        Random random = new Random();
        int[] lotteryNumbers = new int[5];

        for (int i = 0; i < 5; i++) {
            lotteryNumbers[i] = random.nextInt(50) + 1; // 1 到 50 的随机数
        }

        System.out.println("Lottery numbers: " + Arrays.toString(lotteryNumbers));
    }
}

注意事项

  1. 伪随机数的性质

    • Random 生成的随机数是伪随机数,并不真正随机。
    • 对于高安全性需求(如密码生成),推荐使用 java.security.SecureRandom
  2. 多线程环境

    • Random 是线程安全的,但高并发下推荐使用 ThreadLocalRandom
  3. 种子控制

    • 相同的种子会生成相同的随机数序列,因此在测试和调试中很有用。

ThreadLocalRandom 的比较

  • Random

    • 适合单线程环境。
    • 每次调用共享同一个实例,可能导致竞争。
  • ThreadLocalRandom

    • 适合多线程环境。
    • 每个线程独立实例,性能更高。

示例

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {
    public static void main(String[] args) {
        int randomInt = ThreadLocalRandom.current().nextInt(1, 101); // 1 到 100 的随机数
        System.out.println(randomInt);
    }
}

总结

  • Random 的优势

    • 易用,适合大多数单线程随机数生成需求。
    • 支持多种类型的随机数(intdoubleboolean 等)。
  • 注意种子的使用

    • 相同种子可生成相同随机数序列。
    • 对于安全性需求,请使用 SecureRandom
  • 多线程推荐

    • 使用 ThreadLocalRandom,以提高并发性能。

通过灵活使用 Random,可以轻松实现各种随机化功能,从游戏到模拟,再到数据分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 高级--反射 详解

一、反射是什么 1、C#编译运行过程 高级语言->编译->dll/exe文件->CLR/JIT->机器码 2、原理解析metadata&#xff1a;元数据数据清单&#xff0c;记录了dll中包含了哪些东西,是一个描述。IL&#xff1a;中间语言&#xff0c;编译把高级语言编译后得到的C#中最真…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

【软考网工笔记】网络基础理论——应用层

TLv 基本编码规则&#xff08;BER&#xff09;将ASN.1表示的抽象类型值编码为字节串&#xff0c;这种字节串的结构为&#xff1a;类型——长度——值&#xff0c;简称TLv。 其中&#xff0c;值部分还可以递归的在编码为TLv结构&#xff0c;一具有表达复杂结构的能力。 IP地址…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

企业网络安全规划建设实践

规划是指较全面或长远的计划。凡事预则立&#xff0c;不预则废&#xff01; 在企业战略规划方面&#xff0c;随着市场环境变化速度的不断加快&#xff0c;人们越来越意识到企业战略规划对企业生存和发展的重要性&#xff0c;战略规划能帮助企业解决影响组织未来发展最重要、最…

QT基本绘图

QT绘图 1.概述 这篇文章介绍如何绘图 2.绘图基本操作 创建一个普通的widget类型的项目 在widget.h 文件中重写绘图事件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : p…

Linux驱动开发(7):使用设备树实现RGB 灯驱动

通过上一小节的学习&#xff0c;我们已经能够编写简单的设备树节点&#xff0c;并且使用常用的of函数从设备树中获取我们想要的节点资源。 这一小节我们带领大家使用设备树编写一个简单的RGB灯驱动程序&#xff0c;加深对设备树的理解。 1. 实验说明 本节实验使用到 EBF6ULL-…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

Neo4j下载及其Cypher语法介绍

1.部署安装 Neo4j支持众多平台的部署安装&#xff0c;如&#xff1a;Windows、Mac、Linux等系统。Neo4j是基于Java平台的&#xff0c;所以部署安装前先保证已经安装了Java虚拟机。 在神领物流项目中&#xff0c;我们采用docker的方式进行安装。安装命令如下&#xff1a; dock…

【Redis】实现点赞功能

一、实现笔记点赞 使用redis实现点赞功能&#xff0c;对于一个笔记来说&#xff0c;不同用户只能是点赞和没点赞&#xff0c;点赞过的笔记再点击就应该取消点赞&#xff0c;所以实际上根据需求&#xff0c;我们只需要将点赞的数据存到对应的笔记里&#xff0c;查看对应的笔记相…

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS&#xff0c;并结合cpolar内网穿透工…

【Pytorch】torch.utils.data模块

torch.utils.data模块主要用于进行数据集处理&#xff0c;是常用的一个包。在构建数据集的过程中经常会用到。要使用data函数必须先导入&#xff1a; from torch.utils import data 下面介绍几个经常使用到的类。 torch.utils.data.DataLoader DataLoader(dataset, batch_…

XGBOOST、LightGBM、CATBoost

本文介绍几种不同的 GBDT 优化算法&#xff1a; XGBoost XGBoost 对损失函数展开二阶导&#xff0c;使得提升树能逼近真是损失&#xff0c;增加正则项防止过拟合&#xff0c;XGBoost 公式&#xff1a; L( y i y_i yi​, y ^ i \hat{y}_i y^​i​): 损失函数 Ω ( f k ) \Ome…

论文阅读 SimpleNet: A Simple Network for Image Anomaly Detection and Localization

SimpleNet: A Simple Network for Image Anomaly Detection and Localization 摘要&#xff1a; 该论文提出了一个简单且应用友好的网络&#xff08;称为 SimpleNet&#xff09;来检测和定位异常。SimpleNet 由四个组件组成&#xff1a;&#xff08;1&#xff09;一个预先训练的…

多线程4:线程池、并发、并行、综合案例-抢红包游戏

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

Java数据库连接(Java Database Connectivity,JDBC)

1.JDBC介绍 Java数据库连接&#xff08;Java Database Connectivity&#xff0c;JDBC&#xff09;是SUN公司为了简化、统一对数据库的操作&#xff0c;定义的一套Java操作数据库的规范&#xff08;接口&#xff09;。这套接口由数据库厂商去实现&#xff0c;这样&#xff0c;开…

高亮变色显示文本中的关键字

效果 第一步&#xff1a;按如下所示代码创建一个用来高亮显示文本的工具类&#xff1a; public class KeywordUtil {/*** 单个关键字高亮变色* param color 变化的色值* param text 文字* param keyword 文字中的关键字* return*/public static SpannableString highLigh…

2024强化学习的结构化剪枝模型RL-Pruner原理及实践

[2024] RL-Pruner: Structured Pruning Using Reinforcement Learning for CNN Compression and Acceleration 目录 [2024] RL-Pruner: Structured Pruning Using Reinforcement Learning for CNN Compression and Acceleration一、论文说明二、原理三、实验与分析1、环境配置在…

电脑超频是什么意思?超频的好处和坏处

嗨&#xff0c;亲爱的小伙伴&#xff01;你是否曾经听说过电脑超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 今天&#xff0c;我将带你揭开超频的神秘面纱&#xff0c;…

uniapp: vite配置rollup-plugin-visualizer进行小程序依赖可视化分析减少vender.js大小

一、前言 在之前文章《uniapp: 微信小程序包体积超过2M的优化方法&#xff08;主包从2.7M优化到1.5M以内&#xff09;》中&#xff0c;提到了6种优化小程序包体积的方法&#xff0c;但并没有涉及如何分析common/vender.js这个文件的优化&#xff0c;而这个文件的大小通常情况下…