java.util.Random
1、java.util.Random类中实现的随机算法是伪随机,也就是有规律的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
2、相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
3、Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
下面Random()的两种构造方法:
1.Random():创建一个新的随机数生成器。
2.Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
在生成随机数的时候要把种子seed带入到一个公式里面,如下:
protected synchronized int next(int bits) {
seed = (seed * multiplier + 0xbL) & ((1L << 48) - 1);
return (int) (seed >>> (48 - bits));
}
Random() 是以当前时间作为seed的
Random(long seed ) 是以给定的数作为seed的
种子数只是随机算法的起源数字,和生成的随机数的区间没有任何关系。如下面的Java代码:
Random rand =new Random(25);
int i;
i=rand.nextInt(100);
初始化时25并没有起直接作用(注意:不是没有起作用),rand.nextInt(100);中的100是随机数的上限,产生的随机数为0-100的整数,不包括100。
1. 生成指定范围随机数
Random random = new Random();
//生成从 [start, INT_MAX)
int randomNumber = start + random.nextInt();
//生成从 [start,end) 的随机数
int randomNumber = start + random.nextInt(end);
2. 生成不重复的随机数
package com.zoo.lion.util;
import java.util.ArrayList;
import java.util.Random;
public class RandomCoder {
public static void main(String[] args) {
random();
}
private static void random() {
ArrayList list = getDiffNO(10);
System.out.println();
System.out.println("产生的n个不同的随机数:" + list);
}
// 生成n个不同的随机数,且随机数区间为[0,10)
private static ArrayList<Integer> getDiffNO(int n) {
// 生成 [0-n) 个不重复的随机数
// list 用来保存这些随机数
ArrayList<Integer> list = new ArrayList<Integer>();
Random rand = new Random();
boolean[] bool = new boolean[n];
int num = 0;
for (int i = 0; i < n; i++) {
do {
// 如果产生的数相同继续循环
num = rand.nextInt(n);
} while (bool[num]);
bool[num] = true;
list.add(num);
}
return list;
}
}