java随机⽣成long_这些Java中的随机数⽣成⼯具类,总有⼀
款适合你
本⽂由⽜旦教育原创。
0.导⾔
本⽂主要是介绍在Java中⽣成随机数的不同选择和⽅式。实际应⽤中根据⾃⼰的需要选择。
1.Java API
在Java本⾝⾃带的API中,为我们提供了⼏种⽅式来获得随机数。我们来看下。
1.1. java.lang.Math
Math类的random⽅法将返回⼀个范围为0.0(包括0.0)到1.0(不包括1.0)的双精度值。看看该如何使⽤它来获得⼀个在给定的范围(最⼩和最⼤值间)内定义的随机数:
int randomWithMathRandom = (int) ((Math.random() * (max - min)) + min);
这⾏代码的意思为为,我们⽤两个整数,表⽰结果的随机数的取值范围在min和max之间。直接在JShell中简要演⽰这个实现,我这⾥参考如下(每次的结果可能都不同):
1.2. java.util.Random
在Java 1.7之前,最流⾏的⽣成随机数的⽅法是使⽤nextInt。有两种途径使⽤使⽤这个⽅法,即带参
数和不带参数。⽆参数调⽤以近似相等的概率返回任何int值。所以很有可能得到负数,参考代码如下:
Random random = new Random();
int randomWithNextInt = Int();
我在本机JShell中运⾏结果如下:
如果使⽤绑定参数的netxInt⽅法(参数对返回值进⾏范围约定了),我们将得到⼀个范围内的数字,⽰例如下:
int aVal = random(ival) ;
注意:这类需要主要,ival值必须是⼤于0,返回值在0和ival之间,但不包含ival;若参数⼩于等于0,则会报错:
java.lang.IllegalArgumentException.。
演⽰:那么要想得到⼀个在min和max之间的整数,我在JShell中演⽰结果如下:
Java 8引⼊了新的ints⽅法,此⽅法返回java.util.stream.IntStream。IntStream,LongStream,DoubleStream等⽤于操作流中的数据,同时提供了相应的静态⽅法来初始化它们⾃⼰。让我们看看如何使⽤它们。
没有参数的ints⽅法返回⼀个⽆限的int流,其代码⽰例如下:
IntStream unlimitedIntStream = random.ints();
也可以传⼊⼀个参数限制流⼤⼩,⽰例如下:
IntStream limitedIntStream = random.ints(streamSize);
当然,我们可以设置最⼤和最⼩值来⽣成带范围的int流,⽰例如下:
IntStream limitedIntStreamWithinARange = random.ints(streamSize, min, max);
具体⽤户可以查看Java API参考。
1.3. urrent.ThreadLocalRandom
Java 1.7之后,为我们带来了⼀种通过ThreadLocalRandom类来⽣成随机数的更⾼效的新⽅法。这个类与随机类有三个重要区别:
ü 不需要显式地初始化ThreadLocalRandom的新实例。这有助于避免创建⼤量⽆⽤实例和浪费垃圾收集器时间的错误;
ü 不能为ThreadLocalRandom设置种⼦,这会导致⼀个实际的问题。如果我们需要设置种⼦,那么我们应该避免使⽤这种产⽣随机数的⽅式;
ü Random (随机)类在多线程环境中表现不佳。
下⾯看看其⼯作⽅式:
int randomWithThreadLocalRandomInARange = ThreadLocalRandom.current().nextInt(min, max);
使⽤Java 8或更⾼版本,我们就有了新的可能性。
⾸先,nextInt⽅法有两种变体:
int randomWithThreadLocalRandom = ThreadLocalRandom.current().nextInt();
int randomWithThreadLocalRandomFromZero = ThreadLocalRandom.current().nextInt(max);
其次,更重要的是,我们可以使⽤ints⽅法:
IntStream streamWithThreadLocalRandom = ThreadLocalRandom.current().ints();
1.4. java.util.SplittableRandom
Java 8还给我们带来了⼀个⾮常快的⽣成器——SplittableRandom类。
正如我们在JavaDoc中看到的,这是⼀个⽤于并⾏计算的⽣成器。重要的是要知道实例不是线程安全的。所以,我们在使⽤这个类时必须⼩⼼。
还提供了nextInt和ints⽅法。使⽤nextInt,我们可以直接使⽤两个参数设置最⾼最低范围来调⽤:
SplittableRandom splittableRandom = new SplittableRandom();
int randomWithSplittableRandom = Int(min, max);
这种⽅法可以检查max参数是否⼤于min,否则会得到⼀个IllegalArgumentException。但是,它不能检查我们是⽤正数还是负数。所以,参数都可以是任何负的。此外,我们还提供了⼀参和零参的调⽤。它们的⼯作⽅式和我们之前描述的⼀样。
也有ints⽅法。这意味着我们可以很容易地获得⼀个int流。必须清楚,使⽤中可以选择⼀个有限的或⽆限的流。对于⼀个有限的流,我们可以设置最⾼最低的数字⽣成范围约束:
IntStream limitedIntStreamWithinARangeWithSplittableRandom = splittableRandom.ints(streamSize, min, max);
1. .5. java.security.SecureRandom
如果我们有安全敏感的应⽤程序,或说安全要求⾼的,推荐考虑使⽤SecureRandom。这是⼀个加密的强⽣成器。默认构造的实例不使⽤加密随机种⼦。所以,我们应该:
ü 设置种⼦-但种⼦将是不可预测的;
nextint()方法ü 设置java.util.secureRandomSeed系统属性为true;
这个类继承⾃java.util.Random。因此,我们可以使⽤上⾯看到的所有⽅法。例如,如果我们需要获取任何int值,那么可调⽤没有参数的nextInt:
SecureRandom secureRandom = new SecureRandom();
int randomWithSecureRandom = Int();
另⼀⽅⾯,如果我们需要设置范围,我们可以调⽤带参数的⽅法:
int randomWithSecureRandomWithinARange = Int(max - min) + min;
必须当⼼:如果参数不⼤于0,这种使⽤⽅法会抛出IllegalArgumentException。
2.第三⽅API
正如我们所看到的,Java为我们提供了许多⽣成随机数的类和⽅法。然⽽,还有第三⽅提供的API服务于此⽬的。我们来看看其中的⼀些。
2.1. org.apachemons.math
3.random.RandomDataGenerator
让我们看看如何使⽤它。⾸先,我们必须添加依赖:
org.apachemons
commons-math3
3.6.1
可以在Maven Central上到commons-math3的最新版本。
导⼊项⽬后,就可以开始使⽤它们⼯作了,⽰例如下:
RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
int randomWithRandomDataGenerator = Int(min, max);
2.2. it.unimi.dsi.util.XoRoShiRo128PlusRandom
这是最快的随机数⽣成器实现之⼀。它是由⽶兰⼤学信息科学系开发的。
该库也可以在Maven中央存储库中使⽤。因此,让引⽤时可以如下添加依赖:
it.unimi.dsi
dsiutils
2.6.0
这个⽣成器继承⾃java.util.Random。但是,如果我们看⼀下JavaDoc,就会发现只有⼀种⽅法可以使⽤它——nextInt⽅法。最重要的是,此⽅法仅可⽤于零参数和单参数调⽤。其他任何调⽤都将直接使⽤java.util.Random随机⽅法。
例如,如想要得到⼀个范围内的随机数,你可以这样写:
XoRoShiRo128PlusRandom xoroRandom = new XoRoShiRo128PlusRandom();
int randomWithXoRoShiRo128PlusRandom = Int(max - min) + min;
3.最后
通过本⽂,我们知道了有⼏种实现随机数⽣成的⽅法。然⽽,没有最好的⽅法。因此,我们应该选择最适合我们需要的。
你还知道有哪些有趣的随机数⽣成类,分享⼀下吧.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论