一个效率比较高红包算法

Posted 张玉坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个效率比较高红包算法相关的知识,希望对你有一定的参考价值。

提供一个红包算法,随手写的,还有很多需要优化的地方,但是效率比较高,

 

测试效率:一百万次 ,20 个红包的  需要 1.3 秒左右

    一百万次 ,100 个红包的  需要 6.3 秒左右

 

 

代码实现:

 

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 计算红包分配
 * 
 * @author LENOVO
 *
 */
public final class RedPacketUtil {
	public static void main(String[] args) {
		
		  
			long start = System.currentTimeMillis();
			List<Long> list = null;
			int num = 1000000;
			int count = 100;
			for( int i = 0;i<num;i++ ) {
				list = RedPacketUtil.generateRedPacket(10000L, count ,  30L );
			}
			System.out.println("最后一个红包的数据:"  + list );
			Long total = 0L;
			for( long item : list ) {
				total += item;
			}
			System.out.println("请求红包次数:" + num );
			System.out.println("每次红包数:" + count );
			System.out.println("总金额:" + total );
			
			long end = System.currentTimeMillis();
			
			System.out.println( "用时:" + (end-start) );
		
	}
	

	/**
	 * 
	 * @param total 红包总金额
	 * @param count 红包数
	 * @param low 单个的最低值占平均值的比例( 1-99之间的一个数 )
	 * @return
	 */
	public static List<Long> generateRedPacket(Long total,int count,Long low  ){
		List<Long> rtList = new ArrayList<>();
		
		Long avg = total/count;
		if( avg <= 0 ) {
			throw new RuntimeException("最小值不能小于等于0");
		}
		
		Long remainder = total%count;
		
		Long lowValue = avg*low/100;
		lowValue = lowValue == 0?1:lowValue;
		Long otherValue = avg- lowValue;
		
		for( int i=0;i<count;i++ ) {
			rtList.add( lowValue     );
		}
		
		Random random = new Random();
		if( otherValue > 0 ) {
			for( int i=0;i<count;i++ ) {
				long driftAmount =  otherValue *  random.nextInt(10)/10;
				
				int addIndex = random.nextInt( count );
				int reduceIndex = random.nextInt( count );
				
				rtList.set( addIndex ,  rtList.get(addIndex) + driftAmount  );
				rtList.set( reduceIndex ,  rtList.get(reduceIndex) + otherValue-driftAmount );
			}
		}
		
		int addIndex = random.nextInt( count );
		rtList.set( addIndex ,  rtList.get(addIndex) + remainder );
		
		return rtList;
	}

}

 

 百万次 ,20 个的 红包 。 1.3 秒

 

  

 

 百万次 100 个的 红包 6.3 秒

 

 

 

百万次 10 个  红包。0.7 秒

 

以上是关于一个效率比较高红包算法的主要内容,如果未能解决你的问题,请参考以下文章

揭秘微信红包:架构抢红包算法高并发和降级方案(转载)

揭秘微信红包:架构抢红包算法高并发和降级方案

高并发红包整体设计方案

Python能干啥,Python的应用领%

KNN算法的实现

快速排序-递归实现