zl程序教程

您现在的位置是:首页 >  Java

当前栏目

在Java中创建随机数的不同方法

2023-02-19 12:22:28 时间

在 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。