zoukankan      html  css  js  c++  java
  • 随机数

    在实际开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在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从入门到精通(项目案例版)》,转载请注明出处!!! 

  • 相关阅读:
    队列&栈//最小栈
    队列&栈//最小栈
    队列&栈//完全平方数
    队列&栈//完全平方数
    队列 & 栈//打开转盘锁
    队列 & 栈//打开转盘锁
    队列 & 栈//岛屿的个数
    深入理解计算机系统12——并发编程
    深入理解计算机系统11——网络编程
    深入理解计算机系统10——系统级I/O
  • 原文地址:https://www.cnblogs.com/mrxy/p/8203370.html
Copyright © 2011-2022 走看看