看视频觉得这道题很好:
一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。
请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
代码如下:
import java.util.Random;
public class comTest4 {
public static void main(String[] args) {
//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 < 5; ) {//为啥不在这里i++嘞?因为我抽的奖项必须得有效
// 假设我第一次抽的10000,万一我第二次抽的还是1000嘞,这就不能++了吧
//获取arr数组中的随机索引,就能获得出一个随机奖项
int randonIndex = r.nextInt(arr.length);
int prize = arr[randonIndex];
//紧接着得判断这个奖项还在不在,万一被抽走了就得重新抽吧,这也是第13行为啥不能++的原因,那咋判断嘞,可以用一个单独的方法来判断
//调用方法来判断
boolean flag = judge(newArr, prize);
if (!flag) {//如果为false,则把抽到的这个奖项放入newArr数组中,然后就能移动索引到下一个了
newArr[i] = prize;
i++;
}
}
System.out.println("抽奖顺序为:");
//4.最后再来遍历newArr数组,看看抽奖的顺序
for (int j = 0; j < newArr.length; j++) {
System.out.println(newArr[j]);
}
}
//判断奖项是否存在的方法
//存在就是ture,不存在就是false
public static boolean judge(int[] arr, int prize) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == prize) {
return true;
}
}
return false;
}//这样,用来判断奖项是否存在的方法就写好了,然后再反过头去判断上面抽到的奖项
}
运行结果:
抽奖顺序为:
10000
888
588
1000
2
Process finished with exit code 0
还可以换个思路,先把奖池打乱,然后抽奖,也是游戏者的抽奖顺序
代码如下:
import java.util.Random;
public class comTest5 {
public static void main(String[] args) {
//一种新思路:把奖池中所有奖项打乱,在进行抽取,也就是游戏者的抽奖顺序
//1.定义一个数组用来存储奖项
int[] arr = {2, 588, 888, 1000, 10000};
Random r = new Random();
//2.打乱奖池
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;
}
System.out.println("抽奖顺序为:");
//3.遍历奖池
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
运行结果:
抽奖顺序为:
588
10000
1000
2
888
Process finished with exit code 0