中奖概率 new Random().nextInt(1000);这样对吗

奖项 奖品 中奖概率 数量(个)
// 一等奖 免单 0.5% 5
// 二等奖 升舱 1% 10
// 三等奖 贵宾室 10% 100

这样对吗
// 大于等于0到1000之间不包括1000
        int i = new Random().nextInt(1000);
        if (i < 5) {
            System.out.println("一等奖" + i);
            break;
        } else if (i < 10) {
            System.out.println("二等奖" + i);
        } else if (i < 100) {
            System.out.println("二等奖" + i);
        } else {
            System.out.println("没中奖" + i);
        }

需要你确定一下你的抽奖规则,一般来说,抽奖抽出来是不放回去的,比如抽到111号,应该是没中奖,但这个号应该就没了,你写的代码应该是抽完放回去的,有可能有2个人都抽到101,那么也有可能连续6个人都抽到一等奖,这就和你的5个一等奖矛盾了

不对啊。你i是随机产生的数。 5 10 100 是中奖数量。 随机数怎么能小于中奖数量

你这个是写死的,可以动态区算

你这个就是随机数啊。

声明一个集合用来存放已抽过的号码,生成随机数之后,先进到集合里看看是否存在,不存在再进行中奖判断,中奖判断后把该数字添加到集合中,保证下次不再抽到

没仔细看,但你的逻辑肯定有问题,因为你一等奖和二等奖的概率都是0.5%

一等奖0 1 2 3 4
二等奖 5 6 7 8 9-----------------好像并不是10个。。。。。。。。。。。
三等奖 10.....99

二等奖和三等奖都有问题,没有考虑前者占用的个数。

                double[] rates = new double[]{2, 0.2, 50};
        //计算出randSeed
        int maxLength = 0;
        for (Double rate : rates) {
            BigDecimal decimal = new BigDecimal(rate.toString());
            decimal = decimal.subtract(new BigDecimal(rate.intValue()));
            String s = ((Double) decimal.doubleValue()).toString();
            String[] split = s.split("\\.");
            int length = split[1].length();
            if (length > maxLength) {
                maxLength = length;
            }
        }
        int pow = new Double(Math.pow(10, maxLength)).intValue();
        int randSeed = pow * 100;
        int rand = RandomUtils.nextInt(randSeed);
        //排序
        Arrays.sort(rates);
        boolean flag = false;
        for (double rate : rates) {
            int intRate = new Double(rate * pow).intValue();
            if (intRate > rand) {
                flag = true;
            }
        }
        if (flag) {
            System.out.printf("恭喜中奖");
        } else {
            System.out.printf("没中奖");
        }

private static ArrayList before = new ArrayList();// 存放已经抽过的号码
private static int one ;// 统计个数
private static int tow ;
private static int three;
public static void runTest() {
// 生成一等奖 免单 0.5% 5 1-1000
// 二等奖 升舱 1% 10
// 三等奖 贵宾室 10% 100
for(int i=0;i int number = new Random().nextInt(1000);// 本次抽取号码
if (before.contains(new Integer(number))) {// 如果次号码已经抽过
System.out.println("号码重复"+number);
// 重新生成号码
number = new Random().nextInt(1000);
System.out.println("重新生成号码"+number);
} else {
// 进行抽奖
if (number>=0&&number < 5) {
System.out.println("一等奖" + number);
one++;
} else if (number >=5&&number tow++;
System.out.println("二等奖" + number);
} else if (number >=15&&number<115) {
three++;
System.out.println("三等奖" + number);
} else {
System.out.println("没中奖" + number);
}
//抽完把号码放进集合
before.add(new Integer(number));
}
}
System.out.println("中奖统计:"+one+"-----"+tow+"----"+three);
}
这样对吧。。。。。。。。。
输出:
重新生成号码260
号码重复534
重新生成号码13
号码重复218
重新生成号码364
号码重复409
重新生成号码739
5-----10----100

没搞明白楼主需要的抽奖规则,这个代码逻辑应该有问题,首先得明确重建的规则,根据规则设计代码流程

楼主如果仅仅针对一次抽奖的话,这样或许能表达你的意思!
int i = new Random().nextInt(1000);
if (i < 5) {
System.out.println("一等奖" + i);
break;
} else if (i >= 5 & i System.out.println("二等奖" + i);
} else if (i >= 15 & i < 115) {
System.out.println("三等奖" + i);
} else {
System.out.println("没中奖" + i);
}

把break 去掉!