当我们平时在使用微信,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<Integer> list = new ArrayList<Integer>();
for(int i=0; i<peopleCount-1; i++) {
int r = (int)(Math.random() * (totalMoney-1) + 1);
if(list.contains(r)) {
i--;
} else {
list.add(r);
}
}
list.add(0);
list.add(totalMoney);
Collections.sort(list);
for(int j=0; j<peopleCount; j++) {
int get = list.get(j+1) - list.get(j);
System.out.println("第" + (j+1) +"个人抢到:" + get);
}
}
}
运行结果:
第1个人抢到:6
第2个人抢到:11
第3个人抢到:13
第4个人抢到:2
第5个人抢到:20
第6个人抢到:4
第7个人抢到:5
第8个人抢到:10
第9个人抢到:20
第10个人抢到:9
当然,这个算法还有优化的地方,欢迎在评论区讨论。