Java实现刮刮卡奖励游戏概率设置错误致用户必赢问题咨询
刮刮卡游戏问题排查与修复方案
问题原因
- 概率判断逻辑完全颠倒:else if是递进判断,第一个条件
bonusNumber<49已经覆盖了1~49的数值范围,后续的else if条件阈值(27、15、6、2)全部小于49,永远不会被触发,导致4个奖品全部生成10元,必然触发重复中奖规则。 - 随机数对象使用错误:一是
Random ran = new Random()写在while循环内部,每次循环都会重新生成随机种子,导致随机数分布不均;二是创建的对象名叫ran,调用时却用了rand.nextInt,变量名不匹配会直接编译报错。 - 无效代码冗余:定义的bonus数组连续5次给
bonus[0]赋值,后续完全没有使用,属于无效代码。 - 字面量写法不规范:条件里的
06、02是八进制字面量,虽然此处数值和十进制一致,但存在潜在风险。
修复方案
首先调整概率判断逻辑,按照累加概率区间进行判断:
- 1~50(占比50%)对应10元
- 51~77(占比27%)对应20元
- 78~92(占比15%)对应50元
- 93~98(占比6%)对应200元
- 99~100(占比2%)对应1000元
修正后的完整代码如下:
import java.util.Random; public class ScratchCard { public static void main(String[] args) { int[] bonusSum = new int[4]; int bonusAmount1 = 0; int bonusAmount2 = 0; int numCount = 0; // 随机对象放到循环外部创建 Random rand = new Random(); // 选择4个奖品金额 while (numCount < 4) { int bonusNumber = rand.nextInt(100) + 1; // 生成1~100的随机数 if (bonusNumber <= 50) { System.out.print("€10 "); bonusSum[numCount] = 10; numCount++; } else if (bonusNumber <= 77) { // 51-77共27个数字 System.out.print("€20 "); bonusSum[numCount] = 20; numCount++; } else if (bonusNumber <= 92) { //78-92共15个数字 System.out.print("€50 "); bonusSum[numCount] = 50; numCount++; } else if (bonusNumber <= 98) { //93-98共6个数字 System.out.print("€200 "); bonusSum[numCount] = 200; numCount++; } else { //99-100共2个数字 System.out.print("€1,000 "); bonusSum[numCount] = 1000; numCount++; } } // 中奖判断逻辑保持不变即可 if (bonusSum[0]==bonusSum[1] || bonusSum[0]==bonusSum[2] || bonusSum[0]==bonusSum[3]) { bonusAmount1=bonusSum[0]; } if (bonusSum[1]== bonusSum[0] || bonusSum[1]==bonusSum[2] || bonusSum[1]==bonusSum[3]) { if (bonusAmount1==0) { bonusAmount1=bonusSum[1]; }else if (bonusAmount1 == bonusSum[1]) { }else if (bonusAmount2==0) { bonusAmount2=bonusSum[1]; }else if (bonusAmount2 == bonusSum[1]) { } } if(bonusSum[2]==bonusSum[0] || bonusSum[2]==bonusSum[1] || bonusSum[2]==bonusSum[3]){ if (bonusAmount1==0) { bonusAmount1=bonusSum[2]; }else if (bonusAmount1 == bonusSum[2]) { }else if (bonusAmount2==0) { bonusAmount2=bonusSum[2]; }else if (bonusAmount2 == bonusSum[2]) { } } if(bonusSum[3]==bonusSum[0]|| bonusSum[3]==bonusSum[1] || bonusSum[3]==bonusSum[2]) { if (bonusAmount1==0) { bonusAmount1=bonusSum[3]; }else if (bonusAmount1 == bonusSum[3]) { }else if (bonusAmount2==0) { bonusAmount2=bonusSum[3]; }else if (bonusAmount2 == bonusSum[3]) { } } if (bonusAmount1<=0 && bonusAmount2<=0) { System.out.println("\nSorry no Luck this time "); }else { System.out.println("\nCongratulations you have won €"+(Math.addExact(bonusAmount1, bonusAmount2))+"!"); } } }
修正后会正常生成不同档位的金额,当4个金额都不重复时就会触发未中奖逻辑,不会再出现每次都中奖的问题。
内容的提问来源于stack exchange,提问作者Leanne Graham
相关产品推荐
相关产品推荐

