`
yeak2001
  • 浏览: 102783 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

Java的Random

    博客分类:
  • java
阅读更多
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试。

1.测试一: 使用不带参数的Random()构造函数
/** * @author Carl Wu
*/
public class RandomTest  {
public static void main(String[] args) {
      java.util.Random r=new java.util.Random();
     for(int i=0;i<10;i++){
         System.out.println(r.nextInt());
     }
}
}

程序运行结果:
-1761145445
-1070533012
216216989
-910884656
-1408725314
-1091802870
1681403823
-1099867456
347034376
-1277853157

再次运行该程序:
-169416241
220377062
-1140589550
-1364404766
-1088116756
2134626361
-546049728
1132916742
-1522319721
1787867608

从上面的测试我们可以看出,使用不带参数的Random()构造函数产生的随机数不会重复。那么,什么情况下Java会产生重复的随机数呢?且看下面的测试。


2. 测试二:为Random设置种子数
/** * @author Carl Wu
*/
public class RandomTest_Repeat {

    /**
     * @param args
     */
    public static void main(String[] args) {
        java.util.Random r=new java.util.Random(10);
       for(int i=0;i<10;i++){
           System.out.println(r.nextInt());
       }
   }

}


无论程序运行多少次,其结果总是:
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428

甚至在不同的机器上测试,测试结果也不会改变!


3.原因分析: (1) 首先请打开Java Doc,我们会看到Random类的说明:

此类的实例用于生成伪随机数流,此类使用 48 位的种子,该种子可以使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。

如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证实现这种特性,我们为类Random指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。

Java Doc对Random类已经解释得非常明白,我们的测试也验证了这一点。

(2) 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,我们可以非常明确地看到这一点。
    /** 
     * Creates a new random number generator. Its seed is initialized to 
     * a value based on the current time:
     * <blockquote><pre>
     * public Random() { this(System.currentTimeMillis()); }</pre></blockquote>
     *
     * @see     java.lang.System#currentTimeMillis()
     */
public Random() { this(System.currentTimeMillis()); }


4. 结论:
通过上面的测试和分析,我们会对Random类有较为深刻的理解。同时,我觉得,通过阅读Java Doc的API文档,可以很好地提高我们的Java编程能力,做到“知其然”;一旦遇到费解的问题,不妨打开Java的源代码,这样我们就能做到“知其所以然”。
分享到:
评论

相关推荐

    Free Java Random Generating Text Styles.zip

    标题 "Free Java Random Generating Text Styles.zip" 暗示了一个关于Java语言的项目,但实际上,描述中提到的是JavaScript,这是一个常见的误解,因为Java和JavaScript在编程领域虽然名字相似,但实际上是两种不同...

    Java Random.nextInt()方法原理解析

    Java中的`Random`类是用于生成随机数的工具类,`nextInt()`方法是其核心功能之一,用于生成指定范围内的整数。在这个方法的解析中,我们将深入理解`nextInt()`的工作原理以及种子(seed)的概念。 `nextInt(int n)`...

    java random类

    介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程序中要求的几率

    Java Random类的详细介绍(Java生成随机数)

    Java Random类的详细介绍(Java生成随机数)一、Random类的使用1.Random类生成随机数(int)的基本语法:2.几种常用的随机数生成二、Random类的详细介绍1.生成指定范围的数字2.Random.nextInt()与Math.random()的区别 ...

    Java基础之Random随机数.docx

    Java基础之Random随机数 Java中的随机数使用率非常高,因此掌握随机数的使用是非常重要的。在Java中,Random类提供了产生随机数的方法,下面将详细介绍Random类的使用。 Random类的使用 Random类是Java中生成...

    了解Java:RandomAccess

    标题中的“了解Java:RandomAccess”指的是Java编程语言中关于RandomAccess接口或随机访问的概念。在Java中,RandomAccess主要用于标记那些支持高效随机读取的输入流。这意味着,对于实现了RandomAccess接口的输入流...

    随机颜色、大小和位置的多边形画法

    本篇文章将详细解析如何使用javax.swing和java.random类来实现这一功能。 首先,`javax.swing`是Java提供的一个用于构建桌面应用GUI的库,它提供了丰富的组件和布局管理器,使得开发者可以方便地创建用户友好的图形...

    randomNumber_number_java_RandomNumber_

    本篇将详细讲解如何在Java中生成随机数,以及与之相关的`java.util.Random`类。 首先,`java.util.Random`是Java标准库中的一个类,它提供了各种方法来生成随机整数、浮点数和其他类型的随机值。要创建一个`Random`...

    javarandom源码-java_random:我创建的一些随机Java源代码

    在Java编程语言中,`Random`类是Java.util包下的一个核心类,它提供了一系列方法来生成各种类型的随机数。这个类广泛应用于各种场景,包括模拟、加密、游戏开发等。`java_random`项目看起来是一个个人创建的开源项目...

    javarandom源码-random-refactor-java:随机重构Java源代码

    本项目“javarandom源码-random-refactor-java”似乎是对Java原生`Random`类进行了重构,以提供更高效或者功能更丰富的随机数生成服务。下面将详细解析`Random`类的主要知识点以及重构可能涉及的方面。 1. **`...

    java试验,random函数调用等

    在Java编程语言中,`Random`类是生成随机数的核心工具,它位于`java.util`包下。这个类提供了各种方法来生成不同类型的随机数,包括整数、浮点数以及在特定范围内的数字。在"java试验,random函数调用等问题"中,...

    javarandom源码-Java_Stuff:我从中学习到的随机Java源代码及其语法

    在Java编程语言中,`Random`类是生成随机数的核心工具,它位于`java.util`包下。这个类提供了一种生成各种类型随机数的方法,包括整数、长整数、浮点数以及双精度浮点数。让我们深入研究`Random`类的源码,了解其...

    javarandom源码-Random-Sampling-With-A-Reservoir:用Java和python编写的用于随机采样而不用容

    random原始代码有储层的随机抽样 无需随机更换容器即可进行随机采样的代码。 它从包含n个项目的文件中随机选择k个项目的样本。 通常,n足够大,无法容纳到主存储器中。 此算法也适用于流数据 入门 python和java代码...

    RandomTool.java

    生成UUID

    Java产生随机数的两种方式

    本文将详细探讨Java中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`java.lang.Math.random()`方法。这是一个静态方法,不需要实例化对象就可以直接调用。...

    RandomNumber.java

    生成随机字符串 参数passLength:要生成多少长度的字符串 param type:需要哪种类型 // type=0:纯数字(0-9) // type=1:全小写字母(a-z) // type=2:全大写字母(A-Z) // type=3: 数字+小写字母 ...

    java Random.nextInt()方法的具体使用

    Java Random类的nextInt()方法详解 Java 中的 Random 类提供了一个名为 nextInt() 的方法,该方法可以生成一个随机的整数值,该值介于指定的区间内。下面将详细介绍该方法的使用方法和示例代码。 nextInt() 方法的...

    javarandom源码-java_code_generator:生成随机的Java源代码

    random原始代码客观的 开发遵循Java语言规范和Java语法规则的随机生成的程序。 可以对随机生成的代码进行编译,但是生成的代码是一个没有意义的程序,本身没有逻辑。 该应用程序是使用支持Java 1.8 JDK的Java编程...

    JAVA中的随机数产生和排序

    Java提供了两种主要的类来生成随机数:`java.util.Random` 和 `java.security.SecureRandom`。`Random` 类是最常用的,适用于大多数非安全性敏感的场景。创建 `Random` 实例后,可以通过其 `nextInt()`、`nextDouble...

    Java获取随机数的3种方法

    方法二:使用`java.util.Random`类 `Random`类提供了更丰富的随机数生成功能,它可以生成整数、浮点数、长整数等类型的随机数。创建一个`Random`对象后,你可以调用其方法来获取随机数。例如,生成1到10的整数: ```...

Global site tag (gtag.js) - Google Analytics