技术贴 一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序) 888元的奖金被抽出 588元的奖金被抽出 10000元的奖金被抽出 1000元的奖金被抽出 2元的奖金被抽出 这是我觉得难度很大的一题,我自己花了很多时间来理解这个题目,现在来说一下这个题目的思路: 1. 奖项要随机出现,但奖金不是连续的数字,不能被随机产生。能随机产生的只有数组的索引了,可以使用随机索引来代表随机元素。因为索引和元素是一一对应的, 2. 哪些奖被抽过了,哪些奖没有被抽过,要定义一个数组来存放已经被抽过的奖项。 3. 每个奖项只能被抽出一次,要写一个方法来控制奖项不重复。 开始其实我自己不知道从哪里入手,完全懵逼的状态,后来开始看了答案也不能理解,就默默的看了一天… 解决方法: 使用数组存放多个奖金,再使用另一个数组存放已经被抽过的奖金,使用方法来判断某个奖金是否已经被抽取过。 操作步骤 1. 定义奖金的数组arr。 2. 定义数组brr准备存放已经被抽过的奖金,两个数组长度相同。 3. 定义一个变量index,用户代表数组brr的索引。 4. 定义方法,判断数组中是否存在某数字,存在返回true,不存在返回false。 5. 写一个while循环,如果index<arr.length则说明奖项没有被抽完继续抽取。 6. 在循环中使用随机数产生一个随机索引i。 7. 使用步骤4的方法判断brr数组中是否包含arr奖金。 8. 如果不包含,则打印arr奖金,并且把它放入brr数组中代表已经被抽取过,同时index加一 public class Demo8 { public static voidmain(String[] args) { //1.定义存放奖金的数组 int[] arr ={10000,1000,588,888,2}; //2.定义数组存放已经被取过的奖金 int[] brr = newint[5]; //3.定义变量表示brr的索引 int index = 0; //4.创建随机数对象 Random r = newRandom(); //5.定义循环反复获取随机数,如果index小于arr的长度则继续循环 while(index <arr.length){ //5.1每次生成一个随机索引对应一个奖金 int i =r.nextInt(arr.length); //5.2调用方法判断这个奖金是否被获取过 boolean b =exist(brr, arr); //5.3b是false代表这个奖金没有被抽取过 if(!b) { //5.4把获取之后的奖金存放到brr中 brr[index]= arr; //5.5index索引向后移动一次 index++; //5.6打印本次被抽出的奖项 System.out.println( arr + "元的奖金被抽出"); } } } //6.定义方法:判断brr数组中是否存在num这个数字 public static booleanexist(int[] brr,int num){ //6.1对数组进行遍历 for (int i = 0; i< brr.length; i++) { //6.2判断如果找到数字,则返回true if(brr ==num){ returntrue; } } //6.3如果最终没有找到则返回false return false; } }
|