使用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等不规则数字
需要程序使用用户金额生成在上限下限范围内随机缺固定的数量的红包个数,我想了好久了
由于数学比较差,而且红包金额可以根据精度调控后面小数位数

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;
    }
}
u011428089
剑城渔翁 我也写了好多种方案,也请教了各路朋友,最终,都没有一个能准确的比较人性化的算法,如果要有人性化,必须要用性能来换,要用很多判断,就更复杂了,这对于上万个红包分发来说,有点吃力,最终我弄出来的跟你这个差不多
大约一年之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
简单的红包分配算法
今天在群里听朋友说公司要他写一个红包分配算法,闲来无事,就临时帮他写了一下。 废话不多说,直接上代码: $num = 3; //红包个数 $total = 10; //红包总金额 $scale = array(); //比例数组 for($i=0; $i<$num; $i++){ $scale[] = rand(1,100); } $count = array_sum($
红包随机分配算法
红包随机分配算法
Java 实现微信红包分配算法
红包算法分析 在知乎和一些其他的博客中,很多人都提出了自己的观点,我选取其中的一个算法进行分析。比如,有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法。举个例子,如果每个人都拿了自己
Java实现红包随机分配算法
闲来无事,突然想起来红包随机分配算法要怎么实现,经过一阵子思考,勉强用CAS操作和锁两种方式实现了该算法,但对于CAS实现的方式心里没底,我没办法证明算法的正确性,只能简单的重复执行该算法10000次这种恶劣的方式来验证。真心希望有这方面经验的朋友可以交流一下,互相学习。还有个问题是,我把两种算法分别执行10000次的记录耗时,结果发现锁方式比CAS快,这有点出乎意料之外。但事后又想想CAS方式在
java实现微信红包分配算法
红包算法分析有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法。举个例子,如果每个人都拿了自己的最大值:package 红包分配;public class test { publi
红包分配算法之截尾正态分布
最近在研究红包生成算法,通过查阅资料和个人测试,现总结如下: (1)红包数值是随机的,应该近似服从正态分布,即大部分红包钱数在平均值附近,小红包和大红包出现的概率都相对较低。 (2)每份红包数额是有上下限的,所以是个截尾正态分布。 (3)利用Box-Muller变换产生正态分布随机数。 事实上,我们可以通过反函数、中心极限定理、Box-Muller变换、Ziggurat算法等方法来获取正态分
红包分配算法(年后写的)
今天正月十一,春节已经过去了10天,红包想必大家都已经抢很多了,不知道大家有没有想过这个红包怎么实现分配的呢?为什么有的人分这么多,有的人分那么多?到底是怎么实现的呢?答案是,我也不知道。现在最火的就是微信红包了,当然我们也不可能知道微信红包究竟采用了什么样的具体算法,只能通过观察和分析,加上网络上的众人之力,给出一个可能的红包分配方案,红包随机分配算法可以很简单,也可以很复杂,下面就从简入难着手,
QQ红包金额分配算法
最近对红包金额分配感兴趣,便整理了一个较简单的分配算法 思路:主要是通过随机函数对金额随机分配,由于金额与份数不断变化,如何保证分配前等概率呢? 本例是将金额等分,取得均值,但第一份取左和取右等概率,故其最大值为右份边界。 代码:   #include&amp;lt;iostream&amp;gt; #include&amp;lt;iomanip&amp;gt; #include &amp;lt;stdlib.h&amp;gt; ...
Java 随机红包、平均红包分配规则
package com.rsfy.utils; import java.util.ArrayList; import java.util.List; /** * 红包分配规则 * * @author houzh * */ public class RedPacketUtils { // 最小红包额度 private static final int MINMONEY = 1;...
系统中的红包功能、红包算法、红包分配
package com.common; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class HongBaoUtil {     /**      * 1.总金额不能超过500000000 单位是积分      * 2.每个红包都要有积分,最低不能低于500分,最大金...
红包分配
一段分配红包的代码。
实时随机数算法(微信红包分配算法)
用户在抢红包的时候,根据随机算法,算出这次用户要抢到多少的这么一种随机红包算法。
Java: 微信红包分配实现
前阵子app里需要实现抢红包的功能,后台需要个红包分配的算法,于是搜了下找到了实现的主要思想,参考文章http://blog.csdn.net/forever_cvank/article/details/54693000感谢博主的分享。 基本思想就是根据当前剩余金额和人数得到平均值,然后随机,为了防止最后的人分得最大金额需要调整平均值的倍数,这样就会导致后面红包不够分,于是就处理成如果不够分则按
红包算法 Java
Java红包算法 有完整的代码及逻辑分析 大家可以参考
Java 分红包算法
比如10个红包 ,10元总金额。rn要求10个红包每人分到 0.9元~1.3元的样子 。rn求大神帮忙
Java 实现红包算法
推荐微信公众号:【矿洞程序员】文章由高端社区fameLink创始人陶德与我及其他社区大佬联合发表。关注【矿洞程序员】可获得大咖陶德的私人微信。 public class RedPacket { /** * 生成红包最小值 1分 */ private static final int MIN_MONEY = 1; ...
实现一个分配随机红包的JS算法
前因 之前面试的时候,面试官出题让说出生成随机红包的算法的思路,事后,感觉可以仔细研讨下,遂有此文。 后果 条件 获取红包的份额不能超过一个阈值。 随机红包 思路 随机出最小值0到红包奖池有效值乘以阈值的值,这样确保每次获取的值都在有效范围内,这里的阈值是0.618 将随机后的值从红包奖池减去。确保红包奖池内都是有效值。 重复操作n - 1次。 将最后剩余的值直接推入结果数组...
微信红包随机分配算法初探
微信红包随机分配算法初探大家平时都在使用微信收发红包,玩的不亦乐乎。别人在抢红包,而程序员在研究红包算法。那么微信红包的随机分配算法是怎么实现的呢?怎么保证没人都领得到,而且满足正态分布呢?我猜想的算法大概是这样的红包领了不少,据观察红包主要有以下几个限制条件: 所有人都能分到红包,也就是不会出现红包数值为0的情况。 所有人的红包数值加起来等于支付的金额。 红包波动范围比较大,约5%~8%的红包数值
随机分配红包
支持JDK1.6的随机红包分配方案,直接导入jar包即可使用。
红包分配问题
有200元30人分,每人金额在3~10元之间function ranAllo(value, min, max, length) { var arr = [], index; for(var i = 0; i < length; i++) { arr[i] = min;//先将每人红包塞入最小金额; } var le
QQ红包随机分配
思路: 将每个红包设置一个期望值,期望值为红包的总金额/人数, 每个红包最大金额是:期望值的两倍 。 每个红包最小金额是:0.01 。 如此循环,前面的人如果抢到红包大于期望值, 在这后面抢红包的人期望值会变小。 随机出 “总人数 - 1“的红包数量, 剩下的所有金额则是最后一个红包 --------------------- 本文来自 zhaitonghui 的CSDN 博客 ,全文地址请点击...
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实现仿微信红包分配规则
最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。
java实现微信红包分配改进
这是一个微信红包分配算法,可以保证没有数据的精度误差。import java.lang.reflect.Array; import java.math.BigDecimal; import java.util.Arrays;class ArithUtil { private static final int DEF_DIV_SCALE = 10; private ArithUtil()
java 分配算法
/* * 人,权重 */ Map> allot=new HashMap>(); ArrayList servers=new ArrayList(); servers.add(new String[]{"jack","3"}); servers.add(new String[]{"mark","4"}); servers.add(new String[]{"white","7"})
红包算法
$this = rand(1,$all-$num+1); $all -= $this; $num —;
JAVA版的微信红包算法
比如发一个总额为50元的红包,总共分5个: 第一个:在0~10元之间随机产生一个数,作为这一个红包的钱数,设为x1: 第二个:剩下的钱为(50-x1),然后在0~(50-x1)/(5-1)随机一个数,作为这份的钱数,设x2 。。。 第5份:剩下的钱为(50-x1-x2-...x4),系统由0~(50-x1-x2-...-xn-1)/(5-4)随机一个数,作为这个份的钱数,设为xn 首先定
一个简单的红包分配实现
一个简单的红包分配实现
Java权重分配的实现算法
现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用java写起来还是蛮巧妙的。 算法设计:1)总的任务数能被权重和整除,则每个人分配的数量就是:总任务数/权重和*权重2)总的任务数不能被权重和整除,则先按整除的数按1)的方式分,然后余数再优先分给权重较小的执行
微信红包算法,拆分最大的红包法
我的算法是,通过不断拆分最大的红包,完成所有红包金额的分配。先把总金额存入红包列表中,然后开始。第一步:从列表中找出已分配的红包中最大的红包金额,通过随机数将这个红包金额拆分成两个金额,然后保存在红包列表中。第二步:继续第一步,直到红包拆分完毕。为了方便运算,金额统一转换为分,输出结果时再转换回元和分。头文件:#pragma once const unsigned int g_unMaxMone...
php固定红包 + 随机红包算法
1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法。 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行。 2 随机红包的需求是。比如红包总金额5元,需要发10个红包。随机范围是 0.01到0.99;5元必需发完,金额需要有一定趋势的正态分布。(0.99可以任意指定,也可以是 avg * 2 - 0.01;比如avg = 5 / 10 =
小算法(01 红包算法)
/**  * 红包算法  * @author admin  *  */ public class RedPacket {          //最新金额     private static final int MIN_MONEY=1;          //最大金额     private static final int MAX_MONEY=20000;          //最大的红包是平均...
微信随机红包算法
基本思路是这样的:首先算出红包的平均值,再生产小于这个平均值的随机数,红包发送后,红包总金额需要相应减少,同时重新计算这个平均值,直到最后一个红包时,把所有的剩余金额塞进去。 public static double [] getMoney(double money, int num){ Random r = new Random(); DecimalForm
[算法]微信红包
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。 给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。测试样例: [1,2,3,2,2],5 返回:2package 微信红包;import java.util.Arrays;public c
php红包算法
PHP红包面试必备,囊括市场最经典的,希望大家能用得上
微信红包算法
在刚刚过去的2016年春节,微信红包再次成为大众的焦点。微信官方公布的数据显示,除夕当天,微信红包收发总量达10.1亿次,是2015年的200倍。可能有人会好奇,微信红包究竟有什么魔力,让一个又一个的用户爱不释手,安心在大过年的做个“低头族”呢。 抢红包的趣味,都在未知结果上,无论是1角还是1分,都要比在街边捡到了1块钱要兴奋!!接下来我们就来说说关于微信红包的算法是怎么实现的。 先来代码:
红包生成算法
因为企业付款最小金额是0.3元,所以生成的最小金额为三元 public class RedPackageUtil { public static double MIN = 0.3; public static void main(String... args) { for (int i = 0; i &lt; 1; i++) { ...
分红包算法
自己的想法 红包生成算法: 1,利用随机函数,产生最大,最小红包之间的数。(这样的话,数据之间的落差太大,没有意思) 2,使红包能够近似正太分布就符合自然规律些。怎样构造正太分布效果呢? a,二次函数,对轴线定点大于零。 网上的算法: http://blog.cqcoder.com/微信红包的算法实现探讨/
微信红包算法遐想
private final AtomicLong seed; private static final long multiplier = 0x5DEECE66DL; private static final long addend = 0xBL; private static final long mask = (1L << 48) - 1; /**
随机红包算法
/** * * @param total * 红包总额 * @param count * 红包个数 * @param max * 每个小红包的最大额 * @param min * 每个小红包的最小额
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池