Java生成随机数的几种高级用法

转载自 进阶 | Java生成随机数的几种高级用法!

言归正传,众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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)



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

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

相关文章

Java 可重入锁内存可见性分析

转载自 深度好文 | Java 可重入锁内存可见性分析一个习以为常的细节之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:(提示:以下代码均可左右滑动) private static ReentrantLoc…

java正则表达式 ^expr 和 [^expr] 和 ^[^expr]的比较

public class Main {private static String[] array {"Jav", "Java", "Hello"}; public static void main(String[] args) {String[] regexs {"^Java", // 以 Java开头的字符串"[^Java]",// 除了 J a v a 之外 的任何字符…

优秀 Java 程序员写代码的风格

转载自 涨姿势 | 优秀 Java 程序员写代码的风格今天突发奇想,对编码习惯和 编程风格 很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助!来自《…

2017尼毕鲁笔试算法题

【1】题目: 给定一个无序数组,找到最长的单调自增子序列(不一定连续,但是顺序不能乱)的长度; 【2】看个荔枝:给定数组 [10, 9, 2, 5, 3, 7, 101, 18] 输出结果为 [2, 3, 7, 101]。。算法时间…

2018年不能错过的 14 个 Java 库

转载自 2018年不能错过的 14 个 Java 库下面是整理给你的 2018 年不应该错过的 14 个 Java 库包清单,多多少少大家应该都接触过一些,如果还没听过那就OUT了。GuiceGuice是一个Java 6以上支持依赖注入框架。由谷歌提供。OkHttpHTTP是现代网络的通讯方式。…

Spring MVC Boot Cloud 技术教程汇总

转载自 Spring MVC & Boot & Cloud 技术教程汇总昨天我们发布了Java成神之路上的知识汇总,今天继续。 Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ Spring Cloud 的技术…

group by分组、having() 筛选组的用法

【1】选出 除语文学科外,且学科平均分大于60 的每个学科的最高最低分;

Java成神之路技术整理

转载自 Java成神之路技术整理以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新。 Java 基础篇Java 集合篇Java 多线程篇Java JVM篇Java 进阶篇Java 新特性篇Java 工具篇Java 书籍篇 Java基础篇 8张图带你…

RFC+JSF术语

RFC 请求注解(Request For Comments) JSF JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications.

图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)

转载自 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross) Join 连接在日常开发用得比较多,但大家都搞清楚了它们的使用区别吗??一文带你上车~~ 内连接 inner join 内连接是基于连接谓词…

接口、多态

一.接口 1.接口的定义和使用 接口名:和类名一样,首字母大写 public interface 接口名{//接口中的成员,一般写一些抽象方法 } public class 类名 implements 接口名{//复写接口中所有的抽象方法 } 2.接口的成员热点: &#xff0…

基础笔试编程题(jz)

【1】计算某个单词在某文件中出现的次数. // 计算某个单词在某文件中出现的次数. public class WordCounter {private static int counter;private static String path System.getProperty("user.dir") File.separator "src" File.separator "com…

到底什么是 OAuth 2.0

转载自 到底什么是 OAuth 2.0 ? 一文秒懂!- 理解OAuth 2.0OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做一个简明…

在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu

当我们在ecipse安装 maven插件后, (how to install maven plugin named m2eclipse) You can install the lastest M2Eclipse release (1.7.0) by using the following update site from within Eclipse: http://download.eclipse.org/technology/m2e/releases 创建…

继承、抽象

继承、抽象 一.继承 1.继承解决的问题:共性抽取 子类中有共性的内容(成员变量、成员方法)抽取到父类中,子类可以直接使用父类非私有的成员。 2.继承的格式 public cLass 父类{//成员变量、构造方法、成员方法 }public class 子…

JDK 5 ~ 10 新特性倾情整理

转载自 JDK 5 ~ 10 新特性倾情整理最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了。为了大家对JDK有一个全面的了解,下面我为…

Java 内存模型 JMM 详解

转载自 Java 内存模型 JMM 详解JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存…

多种代码块

代码块 1.概念 代码块其实就是一对{ },根据其放的位置不同,它的特性也不同 2.分类 (1)构造代码块 位置:类中方法外 作用:提取构造方法中共性的代码,每次执行构造方法都会执行。 (…

spring boot 入门-使用spring boot构建简单应用

目的&#xff1a;建立一个简单的联系人列表&#xff1b; 使用 spring boot maven 进行构建 【0】文件结构如下&#xff1a; 【1】pom.xml 如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.o…

object面试题

equals方法 public class Demo {public static void main(String[] args) {String s1 "abc";StringBuilder sb new StringBuilder("abc");//System.out.println(sb.append("a"));//s1是字符串,则equals为字符串比较内容,// 由于比较对象不为字…