微信,QQ抢红包算法(Java版)

     当我们平时在使用微信,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

当然,这个算法还有优化的地方,欢迎在评论区讨论。

猜你喜欢

转载自blog.csdn.net/u010592112/article/details/80833649