一切福田,不離方寸,從心而覓,感無不通。

JAVA随机数生成Int、Long、Float、Double

随机数Int的生成

生成无边界的Int

生成有边界的Int

包含1而不包含10

使用Apache Common Math来生成有边界的Int

包含1且包含10

使用Apache Common Lang的工具类来生成有边界的Int

包含1而不包含10

使用TreadLocalRandom来生成有边界的Int

包含1而不包含10


随机数Long的生成

生成无边界的Long

因为Random类使用的种子是48bits,所以nextLong不能返回所有可能的long值,long是64bits。

生成有边界的Long

以上只会生成1到10的long类型的随机数

使用Apache Commons Math来生成有边界的Long

此方式主要使用的RandomDataGenerator类提供的生成随机数的方法

使用Apache Commons Lang的工具类来生成有边界的Long

RandomUtils提供了对java.util.Random的补充

使用ThreadLocalRandom生成有边界的Long


随机数Float的生成

生成0.0-1.0之间的Float随机数

以上只会生成包含0.0而不包括1.0的float类型随机数

生成有边界的Float随机数

使用Apache Common Math来生成有边界的Float随机数

使用Apache Common Lang来生成有边界的Float随机数

使用ThreadLocalRandom生成有边界的Float随机数

ThreadLocalRandom类没有提供


随机数Double的生成

生成0.0d-1.0d之间的Double随机数

与Float相同,以上方法只会生成包含0.0d而不包含1.0d的随机数

生成带有边界的Double随机数

使用Apache Common Math来生成有边界的Double随机数

使用Apache Common Lang生成有边界的Double随机数

使用ThreadLocalRandom生成有边界的Double随机数

JAVA中有多少可以实现随机数的类或方法?

  • java.util.Random 这个类提供了生成Bytes、Int、Long、Float、Double、Boolean的随机数的方法
  • java.util.Math.random 方法提供了生成Double随机数的方法,这个方法的内部实现也是调用了java.util.Random的nextDouble方法,只不过它对多线程进行了更好的支持,在多个线程并发时会减少每个随机数生成器的竞争
  • 第三方工具类,如Apache Common Lang库与Apache Common Math库中提供的随机数生成类,真正使用一行代码来实现复杂的随机数生成
  • java.util.concurrent.ThreadLocalRandom 专为多线程并发使用的随机数生成器,使用的方法为ThreadLocalRandom.current.nextInt(),此类是在JDK1.7中提供的,并且特别适合ForkJoinTask框架,而且在这个类中直接提供了生成有边界的随机数的操作,如public int nextInt(int origin, int bound),这样也可以一行代码来实现复杂的随机数生成了。

最后的总结为单线程中使用java.util.Random类,在多线程中使用java.util.concurrent.ThreadLocalRandom类。

总结

JAVA在不JDK升级中不断在完善API,现在可以使用JDK原生的API写出优雅的代码了。所有的这些测试完整的代码在这里

from:https://www.cnblogs.com/tomyLi/p/JAVA-sui-ji-shu-sheng-chengIntLongFloatDouble.html