摘要:众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。
众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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)
英文出自:summa-tech
译文出自:oschina
分享到:
相关推荐
本文将深入探讨Java中生成随机数的几种方法及其特点。 首先,最基本的随机数生成方法是使用`java.lang.Math.random()`。这个静态方法返回一个介于0.0(包括)到1.0(不包括)之间的双精度浮点数。要生成指定范围内...
总结一下,在Java中生成随机数主要有以下几种方式: 1. 使用java.lang.Math.random(),这是一种简单快捷的方式,适用于单线程环境或对性能要求不高的情况。 2. 使用java.util.Random类创建实例来生成随机数,这种...
以下将详细介绍Java中生成随机数的几种方式。 1. **Math.random() 方法** `Math.random()` 是Java中最常用的方式来生成随机数。它返回一个双精度浮点数,其值在0.0(包括)到1.0(不包括)之间。可以通过简单的...
总之,Java的`Random`类为我们提供了一种灵活的方式去生成各种类型的随机数。在设计验证码或订单编号系统时,我们可以结合时间戳和其他随机成分来确保生成序列的独特性和安全性。通过适当调整参数,可以轻松地生成4...
Java随机数的几种实现方式 Java语言提供了多种方法来生成随机数,每种方法都有其特定的应用场景和优势。以下将详细介绍四种常用的随机数生成方式:使用Math.random()、使用Random类、使用ThreadLocalRandom类以及...
本文将详细介绍几种在Java中生成随机数的方法,并以代码示例进行说明。 1. 使用`Math.random()`函数: `Math.random()`函数是Java中最基本的随机数生成方式,它返回一个在0.0(包括)到1.0(不包括)之间的double...
本文将详细探讨Java中生成随机数的几种实现方式,包括基础的Math.random方法以及更高级的并发实现。 首先,最基本的随机数生成方式是通过`Math.random()`方法。这个方法返回一个0.0到1.0之间的双精度浮点数,包含...
在Java编程中,生成随机数是一项常见的任务,用于模拟、测试和各种算法中。本文将深入探讨Java中生成随机数的多种方法,并分析它们的适用场景和潜在问题。 首先,最基础的随机数生成方法是使用`java.lang.Math....
在 JAVA 中,传统的随机数产生方法有两种:一种是使用 java.lang.Math.random() 静态方法,产生随机数范围是 [0, 1) ;另一种是创建 java.util.Random 对象,再利用 nextInt()、nextFloat() 等函数产生随机整数、...
Java 提供了几种不同的方法来生成随机数。以下是根据标题、描述和标签所提及的三种获取随机数的方法的详细说明: **方法1:基于`Math.random()`** `Math.random()` 是 `java.lang.Math` 类中的一个静态方法,它返回...
生成随机数的方法主要有以下几种: 1. **线性同余法**:是最常见的伪随机数生成算法之一,基于数学公式 `(x_{n+1} = (ax_n + c) mod m)`,其中 `a`、`c` 和 `m` 是预先设定的常数,`x_n` 是当前的随机数,`x_0` 是...
在IT领域,随机数游戏是一种常见的编程练习,用于学习编程语言中的随机数生成技术。在游戏中,随机数可以用于模拟各种不确定性的事件,如掷骰子、抽奖、AI决策等。以下将详细介绍关于随机数游戏的相关知识点。 首先...
总结来说,这个例子提供了一种在Java中生成指定范围内不重复随机数的方法,通过结合`Random`类和集合数据结构实现。在myEclipse环境下,只需几步简单操作,即可运行并测试这段代码。对于开发者来说,理解和掌握这种...
在Java中,我们可以使用`java.util.Random`类来生成随机数。这个类提供了多种方法,如`nextInt()`用于生成指定范围内的整数,`nextDouble()`用于生成0到1之间的双精度浮点数等。要创建一个Random对象,只需调用`new ...
在大多数编程语言中,都有内置的随机数生成函数,例如在Python中,可以使用`random`模块,Java中有`java.util.Random`类,C++中的`<random>`库等。这些函数通常基于特定的算法,如线性同余法、Mersenne Twister或PCG...
本篇文章将详细探讨如何在Java中生成N位随机数,以及提供一份可运行的源码示例,适合初学者学习和参考。 首先,我们要了解Java中的随机数生成机制。Java标准库中的`java.util.Random`类是生成随机数的主要工具。这...
随机数生成源码通常涉及到以下几个关键知识点: 1. **随机数类型**:随机数可以分为伪随机数和真随机数。伪随机数是由确定的算法生成的,看起来随机但实际上可预测;真随机数则是基于物理现象(如电子噪声)生成,...
Java随机数生成 随机数有三种生成方式 1.通过Math.random()方法 2.通过System.currentTimeMillis()方法获取毫秒数, 3.通过Random类 ——————————————————————使用开发工具MyEclipse10 第一种:...