当我们平时在使用微信,QQ抢红包时,总会觉得很神奇,于是今天抽空研究了下其算法,然后参考了一些博客及自己的理解,写了一个算法。
规则:
1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。
2.每个人至少抢到一分钱。
3.要保证所有人抢到金额的几率相等。
算法描述:
1)首先将所有金额m换算成最小单位分,其值为m:如1元=100分(m=100),4.23=423分(m=423)。
2)然后在区间(0,m)上得到(n-1)个随机数,即将所有金额随机划分成了n份。n为红包个数,即抢 红包的人数。
3)将得到的随机数放入放入list,并在list中加入0和m两个元素(主要是为了方便后面计算金额),然后对list进行排序。
代码示例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 抢红包算法
* @author Tony
* 首先将所有金额m换算成最小单位分:如1元=100分,4.23=423分
* 然后在区间(0,m)上得到(n-1)个随机数,即将所有金额随机划分成了n份。n为红包个数。
*/
public class RedPackets{
public static void main(String[] args) {
int peopleCount = 10;
int totalMoney = 100;
getRandomMoney(peopleCount, totalMoney);
}
private static void getRandomMoney(int peopleCount, int totalMoney) {
List list = new ArrayList();
for(int i=0; i
运行结果:
第1个人抢到:6
第2个人抢到:11
第3个人抢到:13
第4个人抢到:2
第5个人抢到:20
第6个人抢到:4
第7个人抢到:5
第8个人抢到:10
第9个人抢到:20
第10个人抢到:9
当然,这个算法还有优化的地方,欢迎在评论区讨论。