奖项 奖品 中奖概率 数量(个)
// 一等奖 免单 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 去掉!