问题描述
- 中奖概率 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 是中奖数量。 随机数怎么能小于中奖数量
解决方案三:
声明一个集合用来存放已抽过的号码,生成随机数之后,先进到集合里看看是否存在,不存在再进行中奖判断,中奖判断后把该数字添加到集合中,保证下次不再抽到
解决方案四:
楼主如果仅仅针对一次抽奖的话,这样或许能表达你的意思!
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);
}
解决方案五:
你这个是写死的,可以动态区算
解决方案六:
你这个就是随机数啊。
解决方案七:
没仔细看,但你的逻辑肯定有问题,因为你一等奖和二等奖的概率都是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("没中奖");
}