http://www.51gjie.com/java/605.html
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。
public Random()
public Random(long seed)
第一个构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
第二个构造方法可以通过制定一个种子数进行创建。
boolean nextBoolean() //返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
void nextBytes(byte[] bytes) //生成随机字节并将其置于用户提供的 byte 数组中。
double nextDouble() //返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
float nextFloat() //返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
double nextGaussian() //返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
int nextInt() //返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt(int n) //返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
long nextLong() //返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
void setSeed(long seed) //使用单个 long 种子设置此随机数生成器的种子。
Random 使用一个48位的种子,如果两个Random类的实例是同一个种子创建的额,对它们以同样的顺序调用,将会参数同样的随机数
import java.util.Random;
public class Test {
public static void main(String[] args) throws Exception
{
Random r1=new Random(45);
Random r2=new Random(45);
System.out.println(r1.nextFloat()+";"+r2.nextFloat());
System.out.println(r1.nextInt()+";"+r2.nextInt());
System.out.println(r1.nextLong()+";"+r2.nextLong());
System.out.println(r1.nextBoolean()+";"+r2.nextBoolean());
}
}
结果是
0.7269366;0.7269366
-266757034;-266757034
-2397444879181054479;-2397444879181054479
false;false
结果完全一样。值得指出的是当使用默认的种子构造随机数时,它们属于同一个种子
从运行结构来看,如果连个Random对象的种子相同,而且方法的调用顺序也相同,则它们会产生同样的数字序列,也就是说,Random产生的不是真正的随机数,而是伪随机数。为了避免两个Random对象产生同样的数字序列,我们可以使用当前时间作为种子Random r=new Random(System.currentTimeMillis());