使用java进行红包分配算法

公司有个红包分发业务模块,需要红包随机生成金额,克提供参数为:
1、红包金额(最小精确到厘:0.001,数据库是用int表示,1元也就是1000厘)
2、红包发放数量
3、红包金额上限
4、红包金额下限
5、金额精度(精度可以理解为随机数能精确到小数哪一位,如范围为:0.01~0.5,如果精确到分的随机数为0.34 or 0.340,如果精确到厘:0.345)

1,2,3,4,5都可以由用户输入或选择,程序可进行判断是否参数不符计算,意思就是:
如果金额为10元,数量为10个,上限就不能大于10-0.001*9=9.991之类的
而且,金额是随用户输入,没有限制10的倍数或者100的倍数,可能会是2546
数量也是由用户输入,也可能为3254等不规则数字
需要程序使用用户金额生成在上限下限范围内随机缺固定的数量的红包个数,我想了好久了
由于数学比较差,而且红包金额可以根据精度调控后面小数位数

0

3个回答

我写了一个,但是感觉没那么满意

 public class Red {
    private int remain;//金额,单位厘
    private int count;//个数
    private Precision precision;//精度
    private int max;//上限,单位厘 
    private int min;//下限,单位厘
    private int[] redPool;
    private int index;

    public static void main(String[] args) {
        int count = 100;
        Red red = Red.newInstance(10 * 1000, count, Precision.FEN, 1 * 1000, 5 * Precision.FEN.getPre());
        int sum = 0;
        for (int i = 0; i < count; i++) {
            int money = red.getRed();
            sum += money;
            System.out.println(money);
        }
        System.out.println("---------------" + sum);
    }

    public int getRed() {
        return index < count ? redPool[index++] : 0;
    }

    public static Red newInstance(int money, int count, Precision precision, int max, int min) {
        Red red = new Red(money, count, precision, max, min);
        String msg;
        if ("".equals(msg = red.validate())) return red;
        else throw new RuntimeException(msg);
    }

    private Red(int money, int count, Precision precision, int max, int min) {
        this.remain = money;
        this.count = count;
        this.precision = precision;
        this.max = max;
        this.min = min;
        init();
    }

    private void init() {
        redPool = new int[count];
        int remain_ = remain;
        for (int i = 0; i < count - 1; i++) {
            int max = getRealMax(remain_, count - i);
            int min = getRealMin(remain_, count - i);
            int money = ((int)(Math.random() * (max - min + precision.getPre())) + min) 
                    / precision.getPre() * precision.getPre();//[min, realMax]
            remain_ -= money;
            redPool[i] = money;
        }
        redPool[count - 1] = remain_;
        randomPool();
    }

    private void randomPool() {
        for (int i = 0; i < count; i++) {
            int index = (int) (Math.random() * count);
            int temp = redPool[i];
            redPool[i] = redPool[index];
            redPool[index] = temp;
        }
    }

    private int getRealMax(int remain, int count) {
        int calMax = remain - ((count - 1) * min);
        return Math.min(calMax, max);
    }

    private int getRealMin(int remain, int count) {
        int calMin = remain - ((count - 1) * max);
        return Math.max(calMin, min);
    }

    public int getRemain() {
        return remain;
    }

    public void setRemain(int remain) {
        this.remain = remain;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        this.min = min;
    }

    public Precision getPrecision() {
        return precision;
    }

    public void setPrecision(Precision precision) {
        this.precision = precision;
    }

    private String validate() {
        String msg = "";
        if (remain <= 0) {
            msg = "余额不能为0";
        } else if (remain % precision.getPre() != 0) {
            msg = "余额的精度不对";
        } else if (count <= 0) {
            msg = "红包个数必须为正数";
        } else if (max % precision.getPre() != 0) {
            msg = "上限的精度不对";
        } else if (max <= min) {
            msg = "上限必须大于下限";
        } else if (min % precision.getPre() != 0) {
            msg = "下限的精度不对";
        } else if (min <= 0) {
            msg = "下限必须大于0";
        } else if (getRealMax(remain, count) < getRealMin(remain, count)) {
            msg = "上下限设置错误";
        }
        return msg;
    }

}
enum Precision {
    LI(1),
    FEN(10),
    JIAO(100),
    YUAN(1000);

    private int pre;
    private Precision(int pre) {
        this.pre = pre;
    }
    public int getPre() {
        return pre;
    }
}
2
u011428089
剑城渔翁 我也写了好多种方案,也请教了各路朋友,最终,都没有一个能准确的比较人性化的算法,如果要有人性化,必须要用性能来换,要用很多判断,就更复杂了,这对于上万个红包分发来说,有点吃力,最终我弄出来的跟你这个差不多
大约一年之前 回复
0

简单的实现就是逻辑采用随机数的方式
比如 10元发10个数量,按照你说的10*1000 = 10000厘
1.生成个9999以内的随机数 比如说生成5300 计数1
2.10000-5300 = 4700 再次生成一个4700内的随机数 计数+1
3.依次类推 最后到9次的时候 使用10000-生成所有随机数之和这样就生成最后一个金额

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
红包随机分配算法
红包随机分配算法
Java 实现微信红包分配算法
红包算法分析 在知乎和一些其他的博客中,很多人都提出了自己的观点,我选取其中的一个算法进行分析。比如,有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法。举个例子,如果每个人都拿了自己
Java实现红包随机分配算法
闲来无事,突然想起来红包随机分配算法要怎么实现,经过一阵子思考,勉强用CAS操作和锁两种方式实现了该算法,但对于CAS实现的方式心里没底,我没办法证明算法的正确性,只能简单的重复执行该算法10000次这种恶劣的方式来验证。真心希望有这方面经验的朋友可以交流一下,互相学习。还有个问题是,我把两种算法分别执行10000次的记录耗时,结果发现锁方式比CAS快,这有点出乎意料之外。但事后又想想CAS方式在
Java 随机红包、平均红包分配规则
package com.rsfy.utils; import java.util.ArrayList; import java.util.List; /** * 红包分配规则 * * @author houzh * */ public class RedPacketUtils { // 最小红包额度 private static final int MINMONEY = 1;...
红包分配算法之截尾正态分布
最近在研究红包生成算法,通过查阅资料和个人测试,现总结如下: (1)红包数值是随机的,应该近似服从正态分布,即大部分红包钱数在平均值附近,小红包和大红包出现的概率都相对较低。 (2)每份红包数额是有上下限的,所以是个截尾正态分布。 (3)利用Box-Muller变换产生正态分布随机数。 事实上,我们可以通过反函数、中心极限定理、Box-Muller变换、Ziggurat算法等方法来获取正态分
红包的随机算法
最近在做关于发红包的功能,写了个工具类。红包的随机算法,亲测可用每人最少可得0.01元
java实现红包随机分配金额
import java.util.Random; class Scratch {     public static void main(String[] args) {         int count = 5;/个数         double amount = 200;/金额         double singleMin = 0.01;//单个红包最小金额         doub...
实时随机数算法(微信红包分配算法)
用户在抢红包的时候,根据随机算法,算出这次用户要抢到多少的这么一种随机红包算法。
Java 红包算法、限定最小和最大临界值
package com.cdjj.test; public class Demo { public static void main(String[] args) { randomPackage(); } public static void randomPackage() { double total_money=2; int total_people=20; doubl
实现一个分配随机红包的JS算法
前因 之前面试的时候,面试官出题让说出生成随机红包的算法的思路,事后,感觉可以仔细研讨下,遂有此文。 后果 条件 获取红包的份额不能超过一个阈值。 随机红包 思路 随机出最小值0到红包奖池有效值乘以阈值的值,这样确保每次获取的值都在有效范围内,这里的阈值是0.618 将随机后的值从红包奖池减去。确保红包奖池内都是有效值。 重复操作n - 1次。 将最后剩余的值直接推入结果数组...
Java实现微信红包随机金额算法
Java实现微信红包随机金额算法 class RandSplitNumUtils { private static final Random random = new Random(); /** * 根据总数分割个数及限定区间进行数据随机处理 * 数列浮动阀值为0.95 * @param total - 被分割的总数 * @par...
QQ红包金额分配算法
最近对红包金额分配感兴趣,便整理了一个较简单的分配算法 思路:主要是通过随机函数对金额随机分配,由于金额与份数不断变化,如何保证分配前等概率呢? 本例是将金额等分,取得均值,但第一份取左和取右等概率,故其最大值为右份边界。 代码:   #include&amp;lt;iostream&amp;gt; #include&amp;lt;iomanip&amp;gt; #include &amp;lt;stdlib.h&amp;gt; ...
java 抢红包的随机钱数分配问题
抢红包是钱数都是随机的,要写出完全是凭运气的代码才行思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱 1,首先生成5个随机数,然后利用每个随机数在5个随机数中所占的比例分配钱数。 2,首先生成4个随机数,然后排序,将这4个随机数放在0~10块的坐标上,截取5段,这5段就是钱数。 当然,还得考虑一个问题,钱
java多线程实现抢红包(介绍四种红包分配算法实现方式)
实现要点 熟悉java多线程应用 对抢红包逻辑有所了解。 主要分成三个部分: 1.红包(红包的总金额、每个红包金额、红包数量、是否预先分配) 2.人(每一个线程当做一个人) 3.抢红包(多个人抢红包,返回抢到的金额或者提示没有抢到) 第一种:抢红包时随机生成红包(规定总金额和数量) 红包: 在抢红包的过程中剩余金额会不断减少,要保证不能两个人同时抢,需要加上悲观锁,同一时间只可以一个人抢,加s...
随机红包的算法及所有随机数等于发出的红包总金额
转载自:https://blog.csdn.net/i_chenjiahui/article/details/54947198 import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Random; public class Test { /...
JAVA实现仿微信红包分配规则
最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。
C# 红包算法
/// /// 红包算法 /// /// /// public static List GetMoneys(RedPacket _redPacket) { //人均最小金额 double min = 0.1; if (_re
随机分配算法(Intege)
参考资料: [url]http://blog.csdn.net/yaerfeng/article/details/18362623[/url] [url]http://www.zuidaima.com/code/file/2214023444104192.htm?dir=/2214023444104192.java[/url] 以下为抢红包的随机分配的Integer实现,主要参考以:抢红包的...
java写的微信红包算法--田小江
写了一个微信红包的算法,记录一下,后续争取再优化一下,大佬们也帮忙看一下。import java.util.HashMap; import java.util.Map; public class WXTRedPackage { public static void main(String[] args) { WXTRedPackage wx = new WXTRedPackage(); ...
python 实现红包随机生成算法
#! /usr/bin/python # -*- coding: utf-8 -*- import random class CDispatch: def __init__(self,sum,count): self.sum = sum self.count=count print 'init here sum =',sum,',coun
php固定红包 + 随机红包算法
1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法。 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行。 2 随机红包的需求是。比如红包总金额5元,需要发10个红包。随机范围是 0.01到0.99;5元必需发完,金额需要有一定趋势的正态分布。(0.99可以任意指定,也可以是 avg * 2 - 0.01;比如avg = 5 / 10 =
PHP 实现微信红包拆分算法
&amp;lt;?php /** * User: jwj * Date: 2018/4/8 * Time: 15:45 * 红包 */ class red_paper{ //红包金额 protected $amount; //红包个数 protected $num; //领取的红包最小金额 protected $paper_min; ...
java实现微信红包随机算法
import java.util.ArrayList; import java.util.List; /** * Created by Spirit on 2017/1/23. */ public class RedEnvelopesDemo { //红包最小值 private static final float MINVALUE = 0.01F; //红包最大值
模拟微信红包分配金额(改良版)
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; /**  *   * 模拟微信分配红包  * 最小值为0.01*红包数  * 最大值为200  *   * @author Cralchan  *  *  */ public class RedPac
红包随机算法
红包随机算法主方法红包页面框架继承红包框架设置红包界面标题开红包模块将如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 主方法 //1.创建Red对象 Red red = new...
怎样写一个红包随机算法
思路提前将红包金额分配完成,等抢红包的人开始抢之后只需管理好这些红包是否抢到就可以了,从根源上简化红包的逻辑。将固定的金额根据人数拆分成人数等量的红包,每个红包的金额随机。随机的金额根据当前剩余金额和抢红包的人数来决定。
实现随机红包的算法
实现随机红包的算法 //产生[0.01,m/n*2-0.01]的随机数 public static void main(String[] args) { List&lt;Integer&gt; integers = randomRedeEnvelope(10000, 5); System.out.println(integers); ...
微信红包随机分配算法初探
微信红包随机分配算法初探大家平时都在使用微信收发红包,玩的不亦乐乎。别人在抢红包,而程序员在研究红包算法。那么微信红包的随机分配算法是怎么实现的呢?怎么保证没人都领得到,而且满足正态分布呢?我猜想的算法大概是这样的红包领了不少,据观察红包主要有以下几个限制条件: 所有人都能分到红包,也就是不会出现红包数值为0的情况。 所有人的红包数值加起来等于支付的金额。 红包波动范围比较大,约5%~8%的红包数值
一个简单的红包分配实现
一个简单的红包分配实现
QQ红包随机分配
思路: 将每个红包设置一个期望值,期望值为红包的总金额/人数, 每个红包最大金额是:期望值的两倍 。 每个红包最小金额是:0.01 。 如此循环,前面的人如果抢到红包大于期望值, 在这后面抢红包的人期望值会变小。 随机出 “总人数 - 1“的红包数量, 剩下的所有金额则是最后一个红包 --------------------- 本文来自 zhaitonghui 的CSDN 博客 ,全文地址请点击...
红包算法探讨
最近在做一些微信红包发放的功能,从而了解了一系列的红包算法。这里探讨一下。给你一定的金额,给发n个红包。 随机数发红包 使用随机数,每次先给红包塞入1分钱,然后在剩余的红包余额里面随机一个金额加入红包内。 缺点:不公平,越后面越亏,越后面的随机数越少,非常不平衡。抢红包抢到心态爆炸。 package 红包; import java.util.Arrays; import java.uti...
[code snippet]微信随机红包算法实现
class RedEnvelopeError(ValueError): &quot;&quot;&quot; 红包赋值错误 &quot;&quot;&quot; class RedEnvelope: def __init__(self, name=None): self.name = 'red_envelope:{}'.format(uuid.uuid1().hex) if name is None ...
Java微信手气红包实现
微信手气红包算法尝试 前言 昨天坐公交车,微信群里在发红包,突然想到在思考一个问题问题:微信的手气红包的算法是如何实现的 就在今天闲的没事开始尝试起来了 初次尝试 一开始的想法很简单,就是固定一个奖金池,每进来一个人就是在这个奖金池中在总金额和0.01之间取随机数当作获得的红包金额,因为要保证每个最低是有一分钱,所以把随机数的总金额减去剩下每人的0.01,之后把奖金池减去刚生成的金额,当到最后一...
javascript实现简单的随机红包
&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt; &amp;lt;title&amp;gt;随机红包&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; #con { width: 300px; h
qq红包后台算法
自己写的qq后包,随机、定额红包,不要错过
红包随机金额
在做一个项目的随机红包金额时,需要随机分配一个奖池的金额,查了其他人写的随机算法,要么分配极不平均,要么不能全部分完奖池,于是自己写了一个 核心思想是每次都按剩余的平均数随机,得到结果比较理想,记录防止忘记。 以下是代码 @Test public void testRandom() throws Exception { int cnt = 12; ...
php 实现红包算法 给定总金额 总人数 最大金额 最小金额 生成红包列表
给定总积分,给定总人数,给定最大与最小值产生随机数/** * 功能:求一个数的平方 */public function _sqr($n){ return $n*$n;}/** * 功能:生产min和max之间的随机数,但是概率不是平均的,从min到max方向概率逐渐减小。 * 先平方,然后产生一个平方值范围内的随机数,再开方,这样就产生了一种“膨胀”再“收缩”的效果。 * @param $p...
c# 红包算法
输入红包总金额和红包数量,通过随机算法计算出所有的单个红包大小以及最佳手气
python 微信红包随机金额
直接上代码吧  # -*- coding: utf-8 -*- from decimal import Decimal, InvalidOperation import random def money_val(min, max):
简单红包算法
package com.suyun.test; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; import java.math.BigDecimal; import ja...