随机数

在实际开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在Java中主要提供了两种方式生成随机数,分别为调用Math类的random()方法和Random类提供的生成各种数据类型随机数的方法,下面分别进行讲解。

Math.random()方法

在Math类中存在一个random()方法,用于生成随机数字,该方法默认生成大于等于0.0小于1.0的double型随机数,即0<=Math.random()<1.0,虽然Math.random()方法只可以生成0~1之间的double型数字,但只要在Math.random()语句上稍加处理,就可以使用这个方法生成任意范围的随机数,如图9.11所示。

图9.11 使用random()方法示意图

为了更好地解释这种生成随机数的方式,下面举例说明。

【例9.10】使用Math.random()方法实现一个简单的猜数字小游戏,要求:使用Math.random()方法生成一个0——100之间的随机数字,然后用户输入猜测的数字,判断输入的数字是否与随机生成的数字匹配,如果不匹配,提示相应的信息,如果匹配,则表示猜中,游戏结束。代码如下: 

public class NumGame {

       public static void main(String[] args) {

              System.out.println("——————猜数字游戏——————
");

              int iNum;

              int iGuess;

              Scanner in = new Scanner(System.in);         // 创建扫描器对象,用于输入

              iNum = (int) (Math.random() * 100);              // 生成0到100之间的随机数

              System.out.print("请输入你猜的数字:");

              iGuess = in.nextInt();                                 // 输入首次猜测的数字

              while ((iGuess != -1) && (iGuess != iNum)) // 判断输入的数字不是-1或者基准数

              {

                     if (iGuess < iNum)  // 若猜测的数字小于基准数,则提示用户输入的数太小,并让用户重新输入

                     {

                            System.out.print("太小,请重新输入:");

                            iGuess = in.nextInt();

                     } else                    // 若猜测的数字大于基准数,则提示用户输入的数太大,并让用户重新输入

                     {

                            System.out.print("太大,请重新输入:");

                            iGuess = in.nextInt();

                     }

              }

              if (iGuess == -1)           // 若最后一次输入的数字是-1,循环结束的原因是用户选择退出游戏

              {

                     System.out.println("退出游戏!");

              } else                           // 若最后一次输入的数字不是-1,用户猜对数字,获得成功,游戏结束

              {

                     System.out.println("恭喜你,你赢了,猜中的数字是:" + iNum);

              }

              System.out.println("
———————游戏结束———————");

       }

}

 

在Eclipse中运行本实例,结果如图9.12所示。

图9.12猜数字游戏

除了随机生成数字以外,使用Math类的random()方法还可以随机生成字符,例如,可以使用下面代码生成a~z之间的字符:

(char)('a'+Math.random()*('z'-'a'+1));

通过上述表达式可以求出更多的随机字符,如A~Z之间的随机字符,进而推理出求任意两个字符之间的随机字符,可以使用以下语句表示:

(char)(cha1+Math.random()*(cha2-cha1+1));

 

在这里可以将这个表达式设计为一个方法,参数设置为随机生成字符的上限与下限。下面举例说明。

【例9.11】在项目中创建MathRandomChar类,在类中编写GetRandomChar()方法生成随机字符,并在主方法中输出该字符。

 

publicclass MathRandomChar {

       //定义获取任意字符之间的随机字符

       publicstaticchar GetRandomChar(char cha1, char cha2) {

              return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));

       }

       publicstaticvoid main(String[] args) {

              //获取a~z之间的随机字符

              System.out.println("任意小写字符" + GetRandomChar('a', 'z'));

              //获取A~Z之间的随机字符

              System.out.println("任意大写字符" + GetRandomChar('A', 'Z'));

              //获取0~9之间的随机字符

              System.out.println("0到9任意数字字符" + GetRandomChar('0', '9'));

       }

}

 

在Eclipse中运行本实例,运行结果如图9.13所示。

图9.13获取任意区间的随机字符

 

Random类

除了Math类中的random()方法可以获取随机数之外,Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类,该类表示一个随机数生成器,可以通过实例化一个Random对象创建一个随机数生成器。语法如下:

Random r=new Random();

其中,r是指Random对象。

以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以生成的随机数将不同,但是如果运行速度太快,也会生成两次运行结果相同的随机数。

同时也可以在实例化Random类对象时,设置随机数生成器的种子。

语法如下:

Random r=new Random(seedValue);

þ  r:Random类对象。

þ  seedValue:随机数生成器的种子。

在Random类中提供了获取各种数据类型随机数的方法,其常用方法及说明如表9.11所示。

表9.11  Random类中常用的获取随机数方法

方法

返回值

功能描述

nextInt()

int

返回一个随机整数

nextInt(int n)

int

返回大于等于0小于n的随机整数

nextLong()

long

返回一个随机长整型值

nextBoolean()

boolean

返回一个随机布尔型值

nextFloat()

float

返回一个随机浮点型值

nextDouble()

double

返回一个随机双精度型值

nextGaussian()

double

返回一个概率密度为高斯分布的双精度值

 

【例9.12】使用Random类模拟微信的抢红包功能,具体实现时,在项目中创建RedBags类,然后根据用户输入的红包额度和个数随机生成每个红包的金额。代码如下:

 

import java.util.Random;

import java.util.Scanner;

publicclass RedBags { // 创建一个RedBags类

       publicstaticvoid main(String[] args) {

              System.out.println("—————————模拟微信抢红包—————————
");

              Scanner sc = new Scanner(System.in); // 控制台输入

              System.out.print("请输入要装入红包的总金额(元):");

 

              doubletotal = sc.nextDouble(); // 输入“红包的总金额”

              System.out.print("请输入红包的个数(个):");

              intbagsnum = sc.nextInt(); // 输入“红包的个数”

              doublemin = 0.01; // 初始化“红包的最小金额”

 

              Random random = new Random(); // 创建随机数对象random

              for (inti = 1; i<bagsnum; i++) { // 设置“循环”

                     /*

                      * 通过公式模拟数学中的离散模型计算一个红包可以放的最大金额

                      * 本次红包可用最大金额 = 可分配金额 - (红包总数 * 已发出的红包数) * 红包的最小金额

                      */

                     doublemax = total - (bagsnum - i) * min;

 

                     doublebound = max - min;// 设置随机金额的取值范围

                     /*

                      * 据随机金额的取值范围,随机生成红包金额。

                      * 由于nextInt(int bound)只能用整型做参数,所以先将bound乘100(小数点向右挪两位)

                      * 获取到一个整数后,将这个整数除100(小数点向左挪两位)并转换成与金额相同的浮点类型

                      */

                     doublesafe = (double) random.nextInt((int) (bound * 100)) / 100;

                     doublemoney = safe + min;// 最后加上红包的最小金额,以防safe出现0值

 

                     total = total - money; // 替换total的值

 

                     System.out.println("第" + i + "个红包:" + String.format("%.2f", money) + "元");

              }

              System.out.println("第" + bagsnum + "个红包:" + String.format("%.2f", total) + "元");

              sc.close(); // 关闭控制台输入

       }

}

在Eclipse中运行本实例,运行结果如图9.14所示。

  

图9.14  模拟微信抢红包功能

  

本文摘自明日科技出版的《Java从入门到精通(项目案例版)》,转载请注明出处!!! 

原文地址:https://www.cnblogs.com/mrxy/p/8203370.html