我们先来回顾下这道题的内容:一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000,2}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)。我在解答这道题时出现的很令自己费脑筋的几个点:1、这是一个数组抽奖问题随机顺序,我们就需要用到Random方法,随机抽出数组中的数值,但是这种随机很大程度上会出现重复数组中的值,而循环5次之后,有些数组内容大有可能不会抽到。2、创造另一个数组,接受这个数组中被抽出的内容,而自己在创造数组中出现,也会出现相同的现象,这样来说,这个创造的数组是无效的。3、接下来思考到,创造的数组在接受到原数组内容时,比方说接收到随机出现的第一个数组内容,那么剩下的的循环次数就会减少4次。4、而且要做到创造的数组,能与随机出现的数组内容,逐一进行比较,有重复则继续循环,而且本次循环不消耗循环次数。
①创造数组brr接受随机出来的arr内容,brr和arr有相同的数组长度;②随机出来的arr数组内容,能逐一和brr数组比较,而这个比较的次数一定是5次;③如果有相同的情况,要跳出本次对比循环,这个循环要求返回的值是布尔类型;④跳出本次循环,之后进入随机数所在的循环,这时这个循环的次数不能出现相加情况。不出现相加的情况,就能知道这个循环值,跟brr与arr比较的环节的数值不是同一个变量⑤再次进入随机数环节,随机出的arr数组内容再次调到②的步骤中。brr已存的内容不能与arr数组内容相同,逐一比较之后,结束循环;⑥把判断结果带到随机数所在的循环中,有另外一个判断语句接收这个返回值,进入下一个缓解,把这个随机出来的arr数组赋值给brr数组。以此完成上面的流程,直到循环5次。结束。
根据上面的想法如何写出呢,根据以上步骤一次写出程序:首先先加入Random方法。①、int brr[]=new int[arr.length]用于接受。②、逐一比较用到变量,定义为i,for(int i=0;i<arr.length;i++){if(brr==arr[])}。③出现相同情况,return true,注意比较之后无相同情况为false,这个false在for循环之外。④、随机数所在循环,因为要让随机出来的内容注意为brr赋值,我们定义为j,这个循环内我们使用while循环。while(j<arr.length){k=r.nextInt(5);
bool b=(brr,arr[k])}。⑤第4个中的判断语句,会进入for循环进行判断。⑥出现都不相同的情况,返回为brr赋值。这里的程序为。if(!b==true){
brr[j]=arr[k];j++},这个操作,让接下来的while循环减少一次,不进入这个判断语句则跳过这个,j不会出现+1的情况。继续执行while循环,知道出现brr内容不等于arr内容。
整个代码如下。解答这道题,个人觉得最重要的是,出现brr==arr内容之后,整个数字还能继续随机,而且还可以随机出剩余的几次。这就要求brr所在的索引,只能在比较brr!=arr内容时,才进行j++操作,这一步很重要,自己就是在这一步一直都没有找到方法解决。里面的while循环,存在bool类型的值能继续运行,而不会导致j++现象的发生,这个操作,是个神操作,自己学到了。
以上就是这道题给自己的学习,收货颇多,第一次学到循环,而不出现自加的情况。
public static void main(String[] args) {
int[] arr={2588,888,1000,10000,2};
int[] brr=new int[5]; 这里是如上的第①步
Random r=new Random(); 这里是第④步
int dex=0;
while (dex<arr.length){
int r1=r.nextInt(5);
boolean b=exist(brr,arr[r1]);//这里的返回值如果是true;则返回到while处再次进入,然后产生r1随机值
if(b==false){//只有!b是true的情况,才可以进来。 这里是第⑥步中的判断
brr[dex]=arr[r1];
dex++;
System.out.println(arr[r1]);
}
}
}
public static boolean exist(int[] brr,int num){
for (int i = 0; i < 5; i++) { 这里是第②步中的创造的循环
if(brr==num){
return true; 这里是第③步中的判断返回值
}
}return false;
}
|
|