java随机生成数字的函数java生成随机数最安全的方法随机生成数字的函数JAVA




java随机生成数字的函数java生成随机数最安全的方法随机生成数字的函数JAVA

2022-07-21 2:26:59 网络知识 官方管理员

对于Java来说,生成随机数的方式大概有三种,分别是:通过Math类生成、通过Random类生成和通过ThreadLocalRandom类生成。其中Random和ThreadLocalRandom的使用方式几乎一样,只不过两者使用的场景不一样而已,其中ThreadLocalRandom在多线程中效率更好。

通过Math类型生成

关于Math类,我已经在我的过去的文章中有过介绍,这里就不过多提及。这里只说一个方法,也就是:Math.random()方法。

对于Math.random()生成的是一个0-1之间的double类型的随机浮点数。

关于使用Math.random()方法生成随机数的示例代码如下所示

publicclassRandomTest{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){System.out.println("第"+i+"次生成的随机数为:"+Math.random());}}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(1)

由于Math.random()只能生成0-1之间的随机数,如果我们想要生成指定范围的随机数,还得加上点算术运算。比如要生成m到n之间的随机数(m<n),那么我首先需要生成0-(n-m)之间的随机数,然后用生成后的随机数再加上m,就可得到所需要的结果。当然,得到的结果是double类型的浮点数,你可以根据需要进行类型强转成对应的类型。

关于使用Math.random()生成指定范围随机数的示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){//生成10在4-8范围内从随机数for(inti=0;i<10;i++){System.out.println("第"+(i+1)+"次生成的随机数为:"+random(4,8));}}//生成指定范围的随机数privatestaticdoublerandom(intstart,intlimit){if(limit<=0){limit=1;}returnMath.random()*(limit-start)+start;}}

执行结果如下图与所示:

java随机生成数字的函数(java生成随机数最安全的方法)(2)

通过Random类生成

生成随机数还可以通过Random类来进行生成。对于Random来说,有两个构造器,分别如下:

  1. publicRandom():无参构造器,默认使用当前系统时间来计算种子
  2. publicRandom(longseed):带参构造器,需自行传入种子。

因为Random生成的是一个伪随机序列,因此当不同的Random对象的种子相同时,就会产生相同的结果。

示例代码如下图所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){Randomr1=newRandom(50);Randomr2=newRandom(50);for(inti=0;i<5;i++){System.out.println("r1的第"+(i+1)+"次生成的随机数为:"+r1.nextInt());System.out.println("r2的第"+(i+1)+"次生成的随机数为:"+r2.nextInt());}}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(3)

通过对比我们可以发现,虽然r1和r2是两个不同的random对象,但是当两者的种子相同时,调用顺序一致时,产生的结果也一致。

  • nextXXX之类的方法

Random的nextXXX之类的方法有:

  1. publicvoidnextBytes(byte[]bytes):生成一个byte数组的随机数
  2. publicintnextInt():随机生成一个整数
  3. publicintnextInt(intbound):随机生成一个在bound范围内的整数
  4. publicbooleannextBoolean():随机生成一个布尔值
  5. publicdoublenextDouble():随机生成一个double类型的浮点值
  6. publicfloatnextFloat():随机生成一个float类型的浮点值
  7. publiclongnextLong():随机生成一个long类型的整数值
  8. publicsynchronizeddoublenextGaussian():随机生成一个高斯数

关于random对象的nextXXX系列的方法使用示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){Randomrandom=newRandom();for(inti=0;i<5;i++){//随机生成一个字节数组byte[]bytes=newbyte[8];random.nextBytes(bytes);System.out.println("第"+(i+1)+"次随机生成的字节数组为:"+Arrays.toString(bytes));//生成随机整数System.out.println("第"+(i+1)+"次随机生成的整数为:"+random.nextInt());//生成一个指定范围的随机整数System.out.println("第"+(i+1)+"次随机生成的在10以内的整数为:"+random.nextInt(10));//随机生成long类型的整数System.out.println("第"+(i+1)+"次随机生成的long类型的整数为:"+random.nextLong());//随机生成的float类型的浮点数System.out.println("第"+(i+1)+"次随机生成的float类型的浮点数为:"+random.nextFloat());//随机生成double类型的浮点数System.out.println("第"+(i+1)+"次随机生成的double类型的浮点数为:"+random.nextDouble());//随机生成布尔值System.out.println("第"+(i+1)+"次随机生成的布尔值为:"+random.nextBoolean());//随机生成的高斯数System.out.println("第"+(i+1)+"次随机生成的高斯数为:"+random.nextGaussian());if(i<4){System.out.println("=========================================");}}}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(4)

  • ints方法

Random对象的ints方法生成是一个随机数的IntStream流对象。其大概有四个重载方法:

  1. publicIntStreamints():获取一个随机整数流。该方法需要配合limit方法来使用,否则会一直生成下去。
  2. publicIntStreamints(longstreamSize):获取一个指定长度的整数流对象。
  3. publicIntStreamints(intrandomNumberOrigin,intrandomNumberBound):获取一个在指定范围内的整数流,该方法也需要配合limit方法来进行使用,否则也会一直生成下去。
  4. publicIntStreamints(longstreamSize,intrandomNumberOrigin,intrandomNumberBound):获取一个在指定范围内的指定个数的整数流对象。

关于ints方法使用示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){Randomrandom=newRandom();int[]randArr1=random.ints().limit(5).toArray();System.out.println(Arrays.toString(randArr1));int[]randArr2=random.ints(5).toArray();System.out.println(Arrays.toString(randArr2));int[]randArr3=random.ints(2,8).limit(5).toArray();System.out.println(Arrays.toString(randArr3));int[]randArr4=random.ints(5,2,8).toArray();System.out.println(Arrays.toString(randArr4));}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(5)

  • longs方法

Random对象的longs方法生成是一个随机数的LongStream流对象。其大概有四个重载方法:

  1. publicLongStreamlongs():返回一个随机的long类型的整数流,需要配置limit方法进行使用。
  2. publicLongStreamlongs(longstreamSize):返回指定个数的long类型的整数流。
  3. publicLongStreamlongs(longrandomNumberOrigin,longrandomNumberBound):返回一个指定范围的随机long类型整数流,需要配置limit进行使用。
  4. publicLongStreamlongs(longstreamSize,longrandomNumberOrigin,longrandomNumberBound):返回一个指定范围的指定个数的long类型整数流。

关于Random的longs方法使用示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){Randomrandom=newRandom();long[]randArr1=random.longs().limit(5).toArray();System.out.println(Arrays.toString(randArr1));long[]randArr2=random.longs(5).toArray();System.out.println(Arrays.toString(randArr2));long[]randArr3=random.longs(2,8).limit(5).toArray();System.out.println(Arrays.toString(randArr3));long[]randArr4=random.longs(5,2,8).toArray();System.out.println(Arrays.toString(randArr4));}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(6)

  • doubles方法

Random对象的longs方法生成是一个随机数的LongStream流对象。其大概有四个重载方法:

  1. publicDoubleStreamdoubles():返回一个随机的double类型的浮点数流,需配合limit进行使用。
  2. publicDoubleStreamdoubles(longstreamSize):返回一个指定个数的double类型的浮点数流。
  3. publicDoubleStreamdoubles(doublerandomNumberOrigin,doublerandomNumberBound):返回一个指定范围的double类型的浮点数流,需配合limit进行使用。
  4. publicDoubleStreamdoubles(longstreamSize,doublerandomNumberOrigin,doublerandomNumberBound):返回一个指定范围的指定个数的double类型的浮点数流。

doubles的示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){Randomrandom=newRandom();double[]randArr1=random.doubles().limit(5).toArray();System.out.println(Arrays.toString(randArr1));double[]randArr2=random.doubles(5).toArray();System.out.println(Arrays.toString(randArr2));double[]randArr3=random.doubles(2,8).limit(5).toArray();System.out.println(Arrays.toString(randArr3));double[]randArr4=random.doubles(5,2,8).toArray();System.out.println(Arrays.toString(randArr4));}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(7)

通过ThreadLocalRandom类生成

对于ThreadLocalRandom来说,其使用和Random差不多,区别在于ThreadLocalRandom在多线程环境下,可以更好减少共享资源的竞争。由于ThreadLocalRandom的使用和Random都差不多,这里就展开来说。仅仅提供一个例子演示一下即可。

使用ThreadLocalRandom的示例代码如下所示:

publicclassRandomTest{publicstaticvoidmain(String[]args){ThreadLocalRandomrandom=ThreadLocalRandom.current();for(inti=0;i<5;i++){System.out.println("第"+(i+1)+"次获取的随机数为:"+random.nextInt());}}}

执行结果如下图所示:

java随机生成数字的函数(java生成随机数最安全的方法)(8)

自此关于Java中获取随机数的常用方式就已经介绍完毕。

发表评论:

最近发表
网站分类
标签列表