需求:
Admin_Log
– 一个大V直播抽奖,奖品是现金红包,分别有{2, 588, 888, 1000, 10000}五个奖金。请使用代码模拟抽奖
– 打印出每个奖项,奖项的出现顺序要随机且不重复。
– 打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
源代码
import java.util.Random; public class Grab_a_red_envelope { 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]; // 3. 抽奖 Random r = new Random(); for (int i = 0; i < arr.length; ) { // 获取随机索引 int randomIndex = r.nextInt(arr.length); // 获取奖项 int prize = arr[randomIndex]; // 判断当前的奖项是否存在,如果存在则重新抽取,如果不存在就表示是有效奖项 /* boolean flag = contains(newArr,prize); if (flag == false){ newArr[i] = prize; i++; } */ if (!contains(newArr, prize)) { // 把当前抽取到的奖项添加到newArr中 newArr[i] = prize; // 添加完毕后,移动索引 i++; } } // 4. 遍历newArr for (int i = 0; i < newArr.length; i++) { System.out.println(newArr[i]); } } // 定义方法 // 判断prize在数组中是否存在 // 存在:true // 不存在:false public static boolean contains(int[] arr, int prize) { for (int i = 0; i < arr.length; i++) { if (arr[i] == prize) { return true; } } return false; } }
上段代码的弊端是每次抽奖都会减少概率,也就是第五个奖项的几率等于20%,有可能会抽很多次,容易出现无效抽奖情况,影响效率,故优化代码如下:(使用随机索引)
Admin_Log优化
优化代码
import java.util.Random; public class Grab_a_red_envelope_Optimization { 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}; Random r = new Random(); for (int i = 0; i < arr.length; i++) { // 获取随机索引 int randomIndex = r.nextInt(arr.length); // 使用 i 和随机索引randomIndex的值进行交换 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]); } } }