微信红包随机算法

这里要写的是,在程序员小灰的公众号上看到的微信红包随机算法中的一个,二倍均值法。

设剩余的红包金额为M,剩余的红包数量为N,那么

抢到的红包金额 = (0,(M/N)* 2)

即若红包总额为100,数量为10,第一个人可以抢到的金额为(0 , (100/10)* 2)即(0 , 20)元,平均值为10元,

假设第一个人抢了10元,那么第二个人可以抢到的金额为(0 , (90/9)* 2)即(0 , 20)元,平均值为10元,以此类推。

// 发红包算法,金额参数以分为单位
	public static List<Double> divideRedPackage(Double totalAmount, Integer totalPeopleNum) {

		List<Double> amountList = new ArrayList<>();

		Integer restAmount = (int)(totalAmount*100);

		Integer restPeopleNum = totalPeopleNum;

		Random random = new Random();

		for (int i = 0; i < totalPeopleNum - 1; i++) {

			// 随机范围:[1,剩余人均金额的两倍),左闭右开

			int amount = random.nextInt(restAmount / restPeopleNum * 2 - 1) + 1;
			restAmount -= amount;
			restPeopleNum--;
			amountList.add(amount/100.0);
		}
		amountList.add(restAmount/100.0);

		return amountList;
	}

	public static void main(String[] args) {

		List<Double> amountList = divideRedPackage(50.0, 3);
		for (Double amount : amountList) {
			System.out.println(amount);
		}
	}

这里存在一个问题是第一个抢的人,最多只能获得人均金额的2倍,而如果前面抢到的红包越小,后面抢红包的人就越能抢到更大的红包,这里可以先随机出每份红包,放进list,然后将list随机排列

Collections.shuffle(amountList);
这样第一个抢红包的人也有可能多余获得人均金额的2倍的红包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值