随机数

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

9.3.1 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 {

       publicstatic void main(String[] args) {

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

              intiNum;

              intiGuess;

              Scannerin = 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("\n———————游戏结束———————");

       }

}

 

在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()方法生成随机字符,并在主方法中输出该字符。 


 

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

   

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

publicclass MathRandomChar {

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

       publicstaticchar GetRandomChar(charcha1, 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'));

       }

}

Random类

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

Randomr=new Random();

其中,r是指Random对象。

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

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

语法如下:

Randomr=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类,然后根据用户输入的红包额度和个数随机生成每个红包的金额。代码如下:

 

importjava.util.Random;

importjava.util.Scanner;

publicclassRedBags { // 创建一个RedBags类

       publicstaticvoidmain(String[] args) {

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

              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  模拟微信抢红包功能

感谢读者朋友对明日科技的支持,如果您对图书中的讲解及光盘源码有任何问题,可以直接登录http://www.mingrisoft.com上的社区进行发贴,把您的问题详细的说明一下,我们的技术人员会在那里给您回复!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值