一个效率比较高红包算法

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

测试效率:一百万次 ,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 秒

原文地址:https://www.cnblogs.com/cxygg/p/9305298.html