java.util.Random
- java.util.Random 中的随机实现算法是伪随机,即有规则的随机,它会在给定的种子(Seed)区间随机生成数字
- 种子相同的 Random 对象,相同次数产生的数字是完全相同的
- Random 中生成的随机数字都是均匀分布的,区间内部的数字生成的概率均等
实际测试
来看一段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package me.redneno;
import java.util.Arrays; import java.util.Random;
public class Main {
public static void main(String[] args) { System.out.println(Arrays.toString(createArray())); System.out.println(Arrays.toString(createArray()));
int seed = 729; System.out.println(Arrays.toString(createArrayWithSeed(seed))); System.out.println(Arrays.toString(createArrayWithSeed(seed))); }
static int[] createArray() { Random random = new Random(); int[] ints = new int[5]; for (int i = 0; i < ints.length; i++) { ints[i] = random.nextInt(100); } return ints; }
static int[] createArrayWithSeed(int seed) { Random randomWithSeed = new Random(seed); int[] ints_with_seed = new int[5]; for (int i = 0; i < ints_with_seed.length; i++) { ints_with_seed[i] = randomWithSeed.nextInt(100); } return ints_with_seed; } }
|
输出:
1 2 3 4
| [47, 1, 6, 10, 39] [55, 67, 47, 12, 75] [27, 35, 38, 95, 41] [27, 35, 38, 95, 41]
|
不难看出,输出结果中,前两组由系统时间毫秒数作种的序列内容相同;而后两组指定了相同的种子生成的结果完全相同。
另外
Java 中还有一个随机类 java.Math.Random() 实际上是在内部调用 java.util.Random() 的,它有一个致命弱点,它和系统时间有关,也就是说相隔时间非常短的两个随机值,例如:
1 2
| double a = Math.random(); double b = Math.random();
|
即有可能会得到两个一模一样的 double。
java.util.Random() 可以实现和 java.Math.Random() 一样的功能,相对来说比较灵活。从总体来看,使用 java.util.Random() 会相对来说更灵活一些。