摘要:众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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作为一门广泛使用的编程语言,提供了多种生成随机数的方式,每种...
本文将深入探讨Java中生成随机数的几种方法及其特点。 首先,最基本的随机数生成方法是使用`java.lang.Math.random()`。这个静态方法返回一个介于0.0(包括)到1.0(不包括)之间的双精度浮点数。要生成指定范围内...
本文将详细介绍如何在C#中生成随机数,包括基本的随机数生成、指定范围内的随机数以及自定义随机数算法。 一、基本随机数生成 C#提供了System.Random类来生成随机数。首先,我们需要创建Random对象,然后调用其Next...
在计算统计学中,随机数生成器是一种至关重要的...总之,这份“计算统计学课程作业30种随机数发生器”是一个综合性的学习资源,涵盖了随机数生成的基础理论和实践操作,对于理解和应用统计学中的随机过程有着重要意义。
以下将详细介绍Java中生成随机数的几种方式。 1. **Math.random() 方法** `Math.random()` 是Java中最常用的方式来生成随机数。它返回一个双精度浮点数,其值在0.0(包括)到1.0(不包括)之间。可以通过简单的...
本文将详细介绍C++中生成随机数的几种方法。 ### 1. `<cstdlib>`库中的`rand()`函数 最基础的随机数生成方法是使用`<cstdlib>`库中的`rand()`函数。它会返回一个0到`RAND_MAX`(通常为32767)之间的伪随机整数。...
通过本文的介绍,我们详细了解了Python中常用的几种随机数生成方法及其应用场景。这些函数不仅简单易用,而且功能强大,能够满足大多数开发需求。掌握了这些知识后,开发者可以在实际项目中更加灵活地使用随机数功能...
Oracle 里取随机数的几种具体的方法 Oracle 是一个功能强大的关系数据库管理系统,它提供了多种方法来生成随机数。随机数生成是许多应用程序的重要组件,例如抽奖活动、验证码生成、密码生成等。在本文中,我们将...
本篇文章将详细梳理MATLAB产生随机数的几种方法,包括几何分布、二项分布和正态分布等常见概率分布的随机数生成。 1. **基本随机数生成** MATLAB的`rand`函数是最基础的随机数生成器,它可以生成[0, 1)区间内的...
本代码主要将常用的几种随机数算法以C++语言封装,例如线性同于法,Fabbona数列法,在保证效率的前提下,方便调用,并且留有一定的可扩展性。 这是第二次写的代码,相比之前: 基本重组组了以前的代码 ,与以前很...
课程还提到了几种随机数发生器的测试方法,例如散点图检查分布的均匀性,Durbin-Watson测试用于检测时间序列数据的自相关性,以及一系列最低标准,如Lewis、Goodman和Miller的标准,这些标准确保生成的随机数序列...
这个压缩包中的30种随机数发生器可能涵盖了以下几种类型: 1. **均匀分布**:MATLAB的`rand`函数就是生成[0,1)区间内的均匀分布随机数,代码可能包括自定义区间或非均匀分布的实现。 2. **正态分布**:`randn`函数...
易语言是一种专为初学者设计的编程语言,其语法简洁明了,易于理解和学习。"易语言猜随机数源码"是一个教学示例,旨在帮助用户理解如何在易语言中生成随机数并实现一个简单的猜数字游戏。在这个游戏中,计算机将生成...
要生成指定长度的随机数,我们需要考虑以下几个关键点: 1. **指定范围**:通常,随机数的生成需要设定一个最小值和一个最大值。如果只指定长度,我们可以假设最小值为0,最大值为2的(长度-1)次方,因为二进制...
随机数生成器的源码通常包括以下几个关键部分: 1. 种子(Seed):随机数生成器的初始值,决定了随机数序列的开始点。一个好的种子通常是当前时间,因为它是不可预测的,确保每次运行程序时都能得到不同的随机数...
多维随机数的生成通常涉及以下几种情况: 1. **各维度独立**:当多维随机变量的维度之间相互独立时,可以通过分别生成每个维度上的随机数,然后将它们组合成一个向量来实现。这种方法简单且直观。 2. **协方差矩阵...
Java实现随机数的几种方式:1.使用Math.random产生随机数;2.使用Random产生随机数;3.使用ThreadLocalRandom产生随机数,在多线程场景下效率更高;4.使用SecureRandom产生随机数,更安全。本代码实现了产生一个指定...