可能会有纰漏,不过应该还是比较符合需求的。
原理主要是生成从(0.01~剩余平均金额两倍)的随机值,加入集合中。
如果前面的人运气差,100块只抢了0.01元,那么由于(剩余金额 / 剩余个数)会增加,所以后面随机到大金额的概率也会增大。所以不存在先抢或后抢不公平的问题。大概吧。概率论早忘了。
public ArrayList<Integer> divide(int cent, int size){ // 输入参数为金额(分) 与红包个数,返回金额的集合
Random r = new Random();
ArrayList<Integer> redList = new ArrayList<>();
if (cent < size) return redList; // 如果金额(分)小于包数,返回空包
while(size > 0) {
if (size == 1) { //如果发到最后一个红包了,剩下的全部塞进去
redList.add(cent);
return redList;
}
int max = (cent / size)*2 ; //最大塞入金额为剩余cent/size的两倍
int insert = r.nextInt(max) + 1; // 金额从1~max随机
redList.add(insert);
cent -= insert; // 剩余金额减去塞进红包的金额
size --; //剩余个数-1
}
return redList;
}
测试结果1:
测试结果2:
运气王发红包!