Java - Random 伪随机数

java.util.Random

  1. java.util.Random 中的随机实现算法是伪随机,即有规则的随机,它会在给定的种子(Seed)区间随机生成数字
  2. 种子相同的 Random 对象,相同次数产生的数字是完全相同
  3. 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()));

/* 生成两组 指定 seed 的整数序列 */
int seed = 729;
System.out.println(Arrays.toString(createArrayWithSeed(seed)));
System.out.println(Arrays.toString(createArrayWithSeed(seed)));
}

static int[] createArray() {
// 不指定 seed,默认使用系统时间毫秒数 System.currentTimeMillis() 作为 seed
Random random = new Random();
// 生成 100 以内的随机整数序列(不包含100)
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) {
// 指定 seed
Random randomWithSeed = new Random(seed);
// 指定 seed 生成 100 以内的随机整数序列
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() 会相对来说更灵活一些。

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×