You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 1~50(占比50%)对应10元
  2. 51~77(占比27%)对应20元
  3. 78~92(占比15%)对应50元
  4. 93~98(占比6%)对应200元
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:45:08