Java中的随机数生成


在开发应用程序时,我们经常需要生成随机数。Java提供了主要通过java.lang.Mathjava.util.Random类生成随机数的支持。

在本文中,我将讨论根据不同类型的需求生成随机数的不同方法。

使用数学类的随机数

Java在java中提供Math类。util软件包以生成随机数。

该数学类包含静态的数学。random () 方法生成double型随机数 。

的随机()方法返回一个双带正号的值,大于或等于0.0且小于1.0。当您调用Math时。random (),在后台是java 。实用程序。创建并使用随机伪随机数生成器对象。

您可以使用Math 。带有或不带有参数的random ()方法。如果提供参数,则该方法会在给定参数内生成随机数。

使用Math的代码。随机()方法:

public static double getRandomNumber(){
    double x = Math.random();
    return x;
}

所述getRandomNumber的()方法使用数学。返回一个大于等于0.0且小于1.0的正double值的random ()方法。

运行代码的输出为:

Double between 0.0 and 1.0: SimpleRandomNumber = 0.21753313144345698

给定范围内的随机数 为了在给定范围之间生成随机数,您需要指定范围。实现此目的的标准表达式是:

(Math.random() * ((max - min) + 1)) + min

让我们将此表达式分解为几个步骤:

首先,将要覆盖的值范围的大小乘以Math的结果。random ()产生。

Math.random() * ( max - min ) 返回范围为[ 0 ,max – min ]的值 ,其中不包括max。例如,如果你想[ 5 ,10 ],你需要支付5个整数值,所以你可以使用数学。随机()* 5。这将在范围返回一个值[ 0 ,5 ],其中不包括5。 接下来,将此范围上移到您要定位的范围。您可以通过添加最小值来实现。 (Math.random() * ( max - min )) + min

但这仍不包括最大值。

要获得包含的最大值,您需要在范围参数(max - min )上加1。这将返回指定范围内的随机双精度数。
double x = (Math.random()*((max-min)+1))+min;

有多种实现上述表达式的方法。让我们看看其中的几个。

给定范围内的随机双精度 默认情况下,Math 。random ()方法在每次调用时都会返回double类型的随机数。在指定范围之间生成随机双精度值的代码为:

public static double getRandomDoubleBetweenRange(double min, double max){
    double x = (Math.random()*((max-min)+1))+min;
    return x;
}

您可以通过传递这样的参数来从main方法中调用前面的方法。

System.out.println("Double between 5.0 and 10.00: RandomDoubleNumber = "+getRandomDoubleBetweenRange(5.0, 10.00));

输出是这个。

System.out.println("Double between 5.0 and 10.00: RandomDoubleNumber = "+getRandomDoubleBetweenRange(5.0, 10.00));

给定范围内的随机整数 在指定范围之间生成随机整数值的代码是这样的。

public static double getRandomIntegerBetweenRange(double min, double max){
    double x = (int)(Math.random()*((max-min)+1))+min;
    return x;
}

前面的getRandomIntegerBetweenRange ()方法在给定范围之间生成一个随机整数。作为数学。random ()方法生成双精度类型的随机数,您需要截断小数部分并将其转换为int以获得整数随机数。您可以通过传递以下参数从main方法中调用此方法:

System.out.println("Integer between 2 and 6: RandomIntegerNumber = "+getRandomIntegerBetweenRange(2,6));

输出是这个。

Integer between 2 and 6: RandomIntegerNumber = 5

注意:您可以传递一个负值范围以在该范围内生成一个随机负数。

使用随机类生成随机数

您可以使用java 。实用程序。随机类,用于生成不同类型的随机数,例如int,float,double,long和boolean。

要生成随机数,请首先创建Random类的实例,然后调用随机值生成器方法之一,例如nextInt (),nextDouble ()或nextLong ()。

Random的nextInt ()方法接受一个有界整数,并返回一个从0(含)到指定界限(不包括)的随机整数。

使用nextInt ()方法的代码是这个。

public static int generateRandomInt(int upperRange){
    Random random = new Random();
    return random.nextInt(upperRange);
}

使用nextInt ()方法生成范围内整数的代码是:

public static int generateRandomIntIntRange(int min, int max) {
    Random r = new Random();
    return r.nextInt((max - min) + 1) + min;
}

所述nextFloat ()和nextDouble ()方法允许生成之间浮点和双精度值0.0和1.0。

使用这两种方法的代码是:

public static double generateRandomDouble(){
    Random random = new Random();
    return random.nextDouble();
}

public static float generateRandomFloat(){
    Random random = new Random();
    return random.nextFloat();
}

Java 8中的随机数生成功能

Java 8在java中引入了一种新方法 ints ()。实用程序。随机类。的整数()方法返回伪随机无限流INT值。您可以通过提供最小值和最大值将随机数限制在指定范围内。

使用Random的代码。ints ()方法生成指定范围内的随机整数值是这个。

public static int getRandomNumberInts(int min, int max){
    Random random = new Random();
    return random.ints(min,(max+1)).findFirst().getAsInt();
}

所述getRandomNumberInts ()方法生成之间的随机整数的流分(含)和最大值(不含)。当ints ()方法产生一个IntStream时,代码将调用findFirst ()方法,该方法返回描述此流的第一个元素的OptionalInt对象。然后,代码调用getAsInt ()方法以返回OptionalInt中的int值。

使用Random的代码。生成指定随机整数值流的ints ()方法是:

public static void getStreamOfRandomInts(int num) {
    Random random = new Random();
    random.ints(num).sorted().forEach(System.out::println);
}

The code to call the preceding method is:

System.out.println("Random int stream: RandomIntStreamofSize = ");

RandomDemo.getStreamOfRandomInts(5);

前面代码的输出是:

Random int stream: RandomIntStreamofSize = 
-1861317227
-1205557317
453883217
762357682
1725970934

使用Random的代码。ints ()方法生成一个指定范围内的指定数量的随机整数流,该流是:

public static void getStreamOfRandomIntsWithRange(int num, int min, int max) {
    Random random = new Random();
    random.ints(num,min, max).sorted().forEach(System.out::println);
}

调用上述方法的代码是:

System.out.println("Random int stream of specified size in range: RandomIntStreamofSizeInRange = ");
RandomDemo.getStreamOfRandomIntsWithRange(5,0,10);

前面代码的输出是:

Random int stream of specified size in range: RandomIntStreamofSizeInRange = 
2
2
3
4
6

除了ints ()之外,Java 8引入Random类的其他一些常用方法(可以返回顺序的随机数流)是:

  • LongStream 多头()
  • DoubleStream 双打()

概括

在java的。实用程序。随机类实现通常称为线性同余生成器(LCG)的东西。它的设计速度很快,但不满足实时使用的要求,例如用于Web服务器上的唯一会话ID生成,科学实验,密码学或涉及金钱的彩票和抽奖活动。对于这种情况,还有其他选择,我将在以后的文章中介绍。

对于不耐烦的读者,您可以看一下SecureRandom类和Xorshift随机数生成器。

此外,有趣的资源是random.org,这是一个真正的随机数服务,可通过generates​​声生成随机性。


原文链接:https://blog.csdn.net/Beibnjin/article/details/113827586?utm_medium=distribute.pc_category.none-task-blog-hot-1.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-1.nonecase&request_id=