昨天在学习《Java编程思想》中的多态时,碰到了有关产生随机数的一些知识,一开始也把我自己搞晕了,后来查看API才发现其中的缘由。
在下面的代码中,RandomShapeGenerator 类是通过产生随机数,然后根据产生的随机数的值来确定该创建哪个对象。但是在程序运行时出现了一个让我感到很奇怪的地方:
如果创建Random对象的代码如下:
private Random random = new Random();
那么每次运行的结果的顺序就不一样
如果创建Random对象的代码如下:
private Random random = new Random(47);
那么每次运行结果的顺序就是一样的
刚开始我想了好久都没想通,后来查看API才知道是怎么个原因,API上面关于创建Random对象的两种方式说法如下:
public Random():
创建一个新的随机数生成器。此
构造方法将随机数生成器的种子设置为某个值,该值与此构造方法的所有其他调用所用的值完全不同。
public Random(long seed)
使用单个 long 种子创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值
从上面的两种构造方法的解释中可以看出,两者唯一的不同就在于:一个产生的随机数的种子是不一定的,另一个产生随机数的种子是以参数的形式出现,是不会变化的。所以就会出现用第一种构造方法产生随机数,每次产生的随机数的顺序都不一样,用第二种构造方法产生的随机数顺序每次都是一样的
更通俗的理解是:每个种子的背后都隐藏着一条固定的数据排列,只要你以某个固定种子产生随机数,那么顺序就是一样的。只有用不同的种子产生的随机数顺序则不同。
package vanceinfo.xuefei.shape;
public class Shape
{
public void draw()
{
}
public void erase()
{
}
}
package vanceinfo.xuefei.shape;
public class Square extends Shape
{
public void draw()
{
System.out.println("Square.draw");
}
public void erase()
{
System.out.println("Square.erase");
}
}
package vanceinfo.xuefei.shape;
public class Triangle extends Shape
{
public void draw()
{
System.out.println("Triangle.draw");
}
public void erase()
{
System.out.println("Triangle.erase");
}
}
package vanceinfo.xuefei.shape;
public class Circle extends Shape
{
public void draw()
{
System.out.println("Circel.draw");
}
public void erase()
{
System.out.println("Circle.erase");
}
}
package vanceinfo.xuefei.shape;
import java.util.Random;
public class RandomShapeGenerator
{
private Random random = new Random();
//private Random random = new Random(47);
public Shape next()
{
switch(random.nextInt(3))
{
default:
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
}
}
}
package vanceinfo.xuefei.shape;
public class Shapes
{
private static RandomShapeGenerator ranGenerator = new RandomShapeGenerator();
public static void main(String[] args)
{
Shape[] s = new Shape[9];
for(int i =0;i<s.length;i++)
{
s[i] = ranGenerator.next();
}
for(Shape shape : s)
{
shape.draw();
}
}
}
分享到:
相关推荐
在Java编程语言中,`Scanner类`、`Random类`和`ArrayList类`是三个非常重要的基础组件,它们各自在不同的场景下发挥着关键作用。接下来,我们将详细探讨这三个类的功能、用法以及它们在实际编程中的应用。 首先,...
031108_【第11章:Java常用类库】_Math与Random类笔记
对于Java中Random类的有关问题做下的思维导图,便于深化记忆,希望对你有帮助!注意:文件为.mm后缀建议下载freemind打开,免费的思维导图软件!
Java8中的java.util.Random类 文章代码,不多解释啦,不需要你安装其它的jar包。
Java中Random类 Java中Random类提供了产生多种形式随机数的功能。使用Random类,可以轻而易举地产生所需的所有形式的随机数,十分方便。在程序设计中,需要大量的不同形式的随机数,使用Math类的random()方法还必须...
今天我们学习了Java中的三个重要类:Scanner类、Random类和ArrayList类。这些类都是Java中的基础类,掌握它们是学习Java的基础。 首先,让我们了解什么是API。API(Application Programming Interface)是应用程序...
介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程序中要求的几率
在本节内容中,我们将介绍Java编程语言中三个重要的类:Scanner类、Random类和ArrayList类。这三个类分别用于处理输入数据、生成随机数以及数据集合存储。在学习这些类的过程中,我们还将探讨如何通过Java的API文档...
掌握String类和StringBuffer类的使用 了解System类、Runtime类、Math类和Random类的使用 熟悉包装类的使用
### Java软件开发实战:Random类和Math类 在Java编程中,`Random`类和`Math`类是非常实用且常用的工具类,它们提供了生成随机数和执行数学运算的方法。本篇将详细介绍这两个类的主要功能及其应用场景。 #### 1. `...
本章主要讲解了Java中的流程控制语句,包括IF语句、switch语句以及for和while循环,还有Random类的使用。 1. **流程控制基本概念**: 流程控制语句是用来控制程序执行流程的,使得程序可以根据条件或循环执行特定...
在这个项目中,我们将会探讨如何利用C#中的控件,如Panel、GroupBox、TabControl,以及Point和Random类来实现这个游戏的界面和功能。 1. **Panel控件**:在C# Windows Forms应用程序中,Panel是一种容器控件,可以...
本文将深入探讨一个名为`CRandom`的类,它被封装用来简化和增强C++中的随机数生成功能。这个类允许开发者轻松地生成指定范围内的随机整数、浮点数以及布尔值,提高了代码的可读性和复用性。 `CRandom`类的核心在于...
day07【Scanner类、Random类、ArrayList类】.md
NULL 博文链接:https://chaoyi.iteye.com/blog/2082321
在Java中,Random类提供了产生随机数的方法,下面将详细介绍Random类的使用。 Random类的使用 Random类是Java中生成随机数的主要类,它提供了多种方法来生成随机数。下面是Random类的一些常用方法: * `nextInt()...
Java中的`Random`类是`java.util`包下的一个核心类,主要用于生成各种类型的伪随机数。这个类在很多场景下都有广泛的应用,比如在模拟、测试、游戏开发以及密码学等领域。`Random`类生成的随机数是通过特定算法得到...
1. 使用默认种子:默认情况下,`Random`类使用系统当前时间作为种子,这样可以保证每次运行时的随机数序列不完全相同。 2. 显示传入种子:可以通过传递一个`long`类型的整数作为种子来创建`Random`对象,从而可以...