java专题练习(抢红包)

复制代码
package 专题练习;

import java.util.Random;

public class grab_red_packet {
    /* 需求:
   直播抽奖,分别由{2,588,888,1000,10000}五个奖金,请用代码模拟抽奖,奖项出现顺序要随机且不重复
   打印效果:
   588元的奖金被抽出*/
    //思路:
    //1. 先用数组把奖金定义好
    //2. 用random方法给出随机数索引
    //3. 题目告诉长度为5.  随机数范围就是0-4
    //4. 难点:不能重复, 那就想办法不让随机数重复就好了
    //总结而言:其实就是一个循环嵌套,外循环来控制输入随机数,内循环来控制是否重复

    public static void main(String[] args) {
        //定义奖金数组
        int[] jiangjin = new int[]{2, 588, 888, 1000, 10000};
        //定义奖金已经出现数组
        int[] jiangjinhavebeen = new int[jiangjin.length];
        //直接调用 答案解出
        Restart(jiangjinhavebeen,jiangjin);
    }
    //抽取随机数的方法
    public static int Get_suijishu(int[] jiangjin){
        //就是随机生成一个数字
        Random r = new Random();
        int suijishu = r.nextInt(jiangjin.length);
        return suijishu;
    }
    //判断重复 重复返回-1   没重复返回1 (内循环)
    public static int Pan_duan_chongfu(int[] havebeenjiangjin,int []jiangjin,int suijishu){
        for (int j = 0; j < havebeenjiangjin.length; j++) {
            if(havebeenjiangjin[j] == jiangjin[suijishu]) {
                return -1;
            }
        }
        return 1;
    }
    //外循环 (重复抽取随机数)
    public static void Restart(int[] jiangjinhavebeen,int[] jiangjin){
        for (int i = 0; i < jiangjinhavebeen.length; ) {
            //先外循环(实现随机数),后内循环(判断是否有重复,如果有重复,外循环次数-1,如果不重复,在外循环读出)
            //实现随机数(调用生成随机数方法)
            int suijishu = Get_suijishu(jiangjin);
            //调用 (判断是否重复方法)
            if(Pan_duan_chongfu(jiangjinhavebeen,jiangjin,suijishu) == 1){
                jiangjinhavebeen[i] = jiangjin[suijishu];//如果没有重复,就把当前的已经抽出来的奖金录入到(已经出现过的奖金)的数组里面去
                System.out.println(jiangjinhavebeen[i] + "元的奖金被抽出");
            }
            else{
                System.out.println("随机数为:" + suijishu + "的奖品已经被抽出,请重新抽取");
                i++; //如果重复,那么外循环的次数就不能增加,应该保持原次数(这里i--,循环条件里由i++,两者相加i刚好还是等于i)
            }
        } 
    }
    
    
    
    //其实这个题目也可以这样理解,就是把原数组打乱(用随机数)最后输出,个人觉得不如上面的代码给到用户信息及时和明确
    public static void mode_two(int[] jiangjin){
        
        for (int i = 0; i < jiangjin.length; i++) {
            int suijishu = Get_suijishu(jiangjin); //获取随机数
            int temp = jiangjin[i];
            jiangjin[i] = jiangjin[suijishu];
            jiangjin[suijishu] = temp;  
        }  //这样就打乱顺序了, 这样的算法也让博主很受启发.
        
        //遍历
        for (int i = 0; i < jiangjin.length; i++) {
            System.out.print(jiangjin[i]);
        }
    }
}
相关推荐
nanxun8864 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103516 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师8 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师12 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_012 小时前
mac(m5)平台编译openjdk
java
JieE21221 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端