Random类

昨天在学习《Java编程思想》中的多态时,碰到了有关产生随机数的一些知识,一开始也把我自己搞晕了,后来查看API才发现其中的缘由。
在下面的代码中,RandomShapeGenerator 类是通过产生随机数,然后根据产生的随机数的值来确定该创建哪个对象。但是在程序运行时出现了一个让我感到很奇怪的地方:
如果创建Random对象的代码如下:
private Random random = new Random();
那么每次运行的结果的顺序就不一样
如果创建Random对象的代码如下:
private Random random = new Random(47);
那么每次运行结果的顺序就是一样的

刚开始我想了好久都没想通,后来查看API才知道是怎么个原因,API上面关于创建Random对象的两种方式说法如下:
public Random():
创建一个新的随机数生成器。此[color=red][b]构造方法将随机数生成器的种子设置为某个值[/b][/color],该值与此构造方法的所有其他调用所用的值完全不同。
public Random(long seed)
[color=red][b]使用单个 long 种子[/b][/color]创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值
从上面的两种构造方法的解释中可以看出,两者唯一的不同就在于:一个产生的随机数的种子是不一定的,另一个产生随机数的种子是以参数的形式出现,是不会变化的。所以就会出现用第一种构造方法产生随机数,每次产生的随机数的顺序都不一样,用第二种构造方法产生的随机数顺序每次都是一样的
更通俗的理解是:每个种子的背后都隐藏着一条固定的数据排列,只要你以某个固定种子产生随机数,那么顺序就是一样的。只有用不同的种子产生的随机数顺序则不同。
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();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值