每个类都有各种方法(或多或少)来生成单独的整数、浮点数、双精度、长整型、布尔值、 上面的每个类都有各种方法来生成 IntStream、DoubleStream 和 LongStream。
在 Java 中,我们可以使用以下类创建随机数:、、.让我们看看它们中的每一个的快速示例,然后我们将讨论它们的差异。RandomSecureRandomThreadLocalRandomSplittableRandom
拆分表随机
package com.logicbig.example;
import java.util.SplittableRandom;
public class SplittableRandomExample {
public static void main(String[] args){
//creating a random int
System.out.println("-- single random int --");
int i = new SplittableRandom().nextInt(10, 100);
System.out.println(i);
//creating stream of ints
System.out.println("-- stream --");
new SplittableRandom()
.ints(5, 10, 100)
.forEach(System.out::println);
}
}
-- single random int --
49
-- stream --
73
35
50
44
88
安全随机
package com.logicbig.example;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.concurrent.ThreadLocalRandom;
public class SecureRandomExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
//creating a random int
System.out.println("-- single random int --");
int i = new SecureRandom().nextInt(100);
System.out.println(i);
//creating stream of ints
System.out.println("-- stream --");
new SecureRandom()
.ints(5, 10, 100)
.forEach(System.out::println);
}
}
-- single random int --
13
-- stream --
80
73
92
30
92
线程本地随机
package com.logicbig.example;
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomExample {
public static void main(String[] args) {
//creating a random int
System.out.println("-- single random int --");
int i = ThreadLocalRandom.current().nextInt(10, 100);
System.out.println(i);
//creating stream of ints
System.out.println("-- stream --");
ThreadLocalRandom.current()
.ints(5, 10, 100)
.forEach(System.out::println);
}
}
-- single random int --
40
-- stream --
23
41
95
44
33
随机
package com.logicbig.example;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class RandomExample {
public static void main(String[] args){
//creating a random int
System.out.println("-- single random int --");
int i = new Random().nextInt(100);
System.out.println(i);
//creating stream of ints
System.out.println("-- stream --");
new Random().ints(5, 10, 100)
.forEach(System.out::println);
}
}
-- single random int --
18
-- stream --
13
60
41
68
32
差异
- java.util.Random它是线程安全的。但是,跨线程并发使用同一个 java.util.Random 实例可能会遇到争用和随之而来的性能不佳。
自 Java 1.0 以来 - java.security.SecureRandom此类提供加密强度高的随机数生成器。我们应该在安全敏感的应用程序中使用它。
从 Java 1.1 开始 - java.util.concurrent.ThreadLocalRandom隔离到当前线程的随机数生成器。使用内部生成的种子为当前线程初始化单个实例,单个线程可以通过方法一遍又一遍地访问该种子。与 相比,此生成器遇到的开销和争用要少得多。
从 Java 1.7 开始ThreadLocalRandom.current()java.util.Random - java.util.SplittableRandom它是高性能的随机数生成器。SplittableRandom 的单个实例不是线程安全的。它们被设计为跨线程拆分,而不是共享。例如,使用随机数的fork/join样式计算可能包括新Subtask(aSplittableRandom.split()).fork()形式的构造。
它们适用于 Java 8 流的并行计算。每次加入拆分任务时,它们始终会产生相同的结果,因此它们是确定性的,ThreadLocalRandom 没有该特征。从 Java 1.8 开始
上述每个类都有各种方法(或多或少)来生成单独的整数、浮点数、双精度、长整型、布尔值、 上面的每个类都有各种方法来生成 IntStream、DoubleStream 和 LongStream。