一个效率比较高红包算法

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

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

时间: 2024-11-07 11:21:58

一个效率比较高红包算法的相关文章

求一个红包算法

m个硬币,n个红包,红包里的硬币数不可以小于b,也不可以大于t,数目是随机的. mnt均为自然数,且 n*b<=m<=n*t. 求红包算法 function getRedPackets(m,n,b,t){ var ret = new Array(n); /*todo*/ return ret; }

一个谷歌程序员的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——

布隆过滤器--空间效率很高的数据结构

一.先谈哈希 1.1原理 Hash (哈希,或者散列)函数在计算机领域,尤其是数据快速查找领域,加密领域用的极广. 其作用是将一个大的数据集映射到一个小的数据集上面(这些小的数据集叫做哈希值,或者散列值). 1.2一个典型的hash函数示意图 1.3特点 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的.散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的.但也可能不同,这种情况称为 “散列碰撞”(或者 “散列冲突”). 1.4缺点

js jquery版本的 金额千分位转换函数(非正则,效率极高)

没想到js里面没有 金额千分位格式化的处理函数(例:1,234.01 这样的格式),网上搜了一圈,都是使用正则的方式处理的.正则的效率不敢恭维啊,又耗费资源速度又慢(虽然处理起来会直观一些). 因此专门写了一个纯数值处理最后输出字符串个 金额千分位处理函数,并封装成jQuery函数包,处理时效率很高,可高频率的使用,直接上代码.还有min压缩版本可点击连接下载. 如果你不是jQuery环境,直接把源码拿出来,重新封装到自己的函数中能够就能用. 源码以及min包下载地址:jQuery.format

红包算法思考和总结

参考: http://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=402360599&idx=1&sn=69318b235e0e8b402d6fc566a3355af4&scene=0#wechat_redirect 进入知乎<微信红包的随机算法是怎样实现的>查看更多人的算法. 最近看到抢红包这么火,早就想尝试去把抢红包的功能试着去做一做了.刚好今天看到参考的网址,就产生了这一篇总结性的文章了. 我的早期逻辑猜想?

红包算法

今天看到一个红包算法,就使用了拿来主义 $total=10; //总额 $num=8; // 分成8个红包,支持8人随机领取 $min=0.10; //每个人最少能收到0.10元 for ($i=1;$i<$num;$i++) { $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 ,这里算的是剩余的钱除以剩余的人的平均值 $money=mt_rand($min*100,$safe_total*100)/100; $total=$tota

一个关于字符串匹配的算法题目

有这样一个算法题目 假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些.从算法是讲, 什么方法能最快的查出所有短字符串里的字母在长字符串里都有? 比如,如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOM 答案是true,所有在string2里的字母string1也都有.如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOZ 答

.NET快速信息化系统开发框架 V3.2-&gt;WinForm版本新增新的角色授权管理界面效率更高、更规范

角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能)权限.可以对所有角色.用户.模块(菜单).操作(功能)权限进行集中批量设置,角色户授权范围的设置(类似于用户授权范围的设置),表字段权限的设置以及表约束条件权限的设置等. 在角色授权管理模块可以对指定角色进行相应权限的分配与收回,添加与移除角色所拥有的用户,对角色所拥有的操作功能.模块访问权限等进行

微信红包算法

微信红包有多种玩法,其中一种就是指定金额.人数(m),拆红包的人收到的金额是随机,收到的金额保留两位小数,至少有一分,所有人的红包加起来等于指定金额. 我想到一种做法就是:将指定金额放大100倍,也就是变成单位"分",这时金额就是整数了,设为n,从1到n这个整数区间随机抽取m(是人数)个整数,这样1到n的整数区间就分成了m或m+1(这种情况,最后的两个区间合成一个区间)个区间. 比如输入金额1.00元,人数m=3,n=100 * 1.从1到100之间随机选中的三个整数为15.42.88