Random random = new Random();
//总金额
int total = 10000;//所有金额都是以分为单位的(金融界)
//红包数量
int num = 20;
//最小红包
int min = 100;
List<Integer> list = new ArrayList<Integer>();
int totalTmp = 0;
for(int i = 0;i<num;i++){
int hongbao = 0;
//预留红包(不然第一个红包很多,第二个也很大,后面的红包没钱了)
Integer pre = min*(num-i-1);
/*除以5 是为了随便生成的数太大,而导致红包分配不均匀()
这个数字越大,导致最后一个红包很大,其他的很小
*/
hongbao = random.nextInt((total-pre-totalTmp)/5);
hongbao = hongbao < min ? min : hongbao;
if(i==num-1) {
hongbao = total - totalTmp;
}
totalTmp += hongbao;
list.add(hongbao);
}
System.out.println(list);
Collections.shuffle(list);//重新洗牌打乱
System.out.println(list);
//校验生成的红包总金额是否一致
int amount = 0;
for (Integer a:list) {
amount += a;
}
System.out.println("num"+list.size());
System.out.println(amount + " "+ total +" "+totalTmp);
//生成的红包以队列的形式存入redis,抢红包时性能更好。
java生成红包的简单算法
最新推荐文章于 2024-07-20 09:45:00 发布