一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。

打印效果如下:(随机顺序,不一定是下面的顺序)

888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出

思路一

从奖池里抽出奖项,存入新的数组里面,再遍历新数组

import java.util.Random;

public class Test10 {
    public static void main(String[] args) {
        //抽奖实现
        /*
        一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金。
        请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
        打印效果如下:(随机顺序,不一定是下面的顺序)

888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出

         */

        //1.定义一个数组存储奖项
        int[] arr = {2, 588, 888, 1000, 10000};
        //2.再定义一个存储已经抽出的奖项
        int[] newArr = new int[arr.length];


        Random r = new Random();

        for (int i = 0; i < 5;) {//这里出错一次,忘记删i++
            int prize = arr[r.nextInt(arr.length)];
            boolean flag = contain(newArr, prize);
            if (!flag) {
                newArr[i] = prize;
                i++;
            }

        }

        //遍历新数组输出
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i]);

        }
    }


    //定义一个方法,用于判断数组里是否有某个数字
    public static boolean contain(int[] newArr, int prize) {
        for (int i = 0; i < newArr.length; i++) {
            if (newArr[i] == prize) {
                //有返回true
                return true;
            }

        }
        //遍历完成后,没有返回false
        return false;

    }

}

思路二

打乱原数组顺序,遍历数组,效率更高

import java.util.Random;

public class Test11 {
    public static void main(String[] args) {
        //抽奖代码优化

        int[] arr = {2, 588, 888, 1000, 10000};
        //1.打乱奖池
        //数组打乱,把每一个数组元素和一个随机元素交换
        Random r = new Random();

        for (int i = 0; i < arr.length; i++) {
            int randomIndex = r.nextInt(arr.length);
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;


        }


        //2.遍历奖池

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);

        }
    }
}

你可能感兴趣的:(java,算法,数据结构)