文档章节

随机生成红包金额算法

Gavaen
 Gavaen
发布于 2016/12/07 14:18
字数 314
阅读 42
收藏 0
    /**
     * 随机生成红包金额
     * @param $n 红包个数
     * @param $sum  总金额 整数
     * @param $index_max  最大金额在数组中索引
     * @param $error
     * @return array|false
     */
    public static function GenRandRePacketsData($n,$sum,&$index_max,&$error)
    {
        //$n = 20;
        //$sum = 300;
        if($sum < $n)
        {
            $error = '金额总数不能小于红包个数'; //$error = '金额总数必须大于红包个数';
            return false;
        }
        if($n > 50)
        {
            $error = '红包数量不能大于50';
            return false;
        }
        //$sum = $sum * 100;//转为分
        $rst = [];
        $ave = intval($sum/$n);  // 金额除去红包个数 平均值 test:3/3 = 1
        $one_rst = rand(1,$ave); // 随机取1到平均值的数
        $subSum = $one_rst;  // 1
        //$rst[] = $one_rst/100;
        $rst[] = $one_rst; // $rst = ['0'=>1];
        $index_min = 0;
        $index_max = 0;
        $min = $one_rst; // 1
        $max = $one_rst; // 1

        for($i = 2; $i <= $n; $i ++)
        {                   
            $ave = intval(($sum - $subSum)/($n - $i + 1)); // 1
            $one_rst = rand(1,$ave); // 1
            if($min > $one_rst) // 1 > 1
            {
                $min = $one_rst;
                $index_min = $i -1;
            }
            if($max < $one_rst) // 1 < 1
            {
                $max = $one_rst;
                $index_max = $i -1;
            }
            //$rst[] = $one_rst/100;
            $rst[] = $one_rst;
            $subSum += $one_rst; // 1
        }
        $left = $sum - $subSum;

        if($left > 0)
        {
            //$rst[$index_min] = ($rst[$index_min] + $left/100);
            $rst[$index_min] = ($rst[$index_min] + $left);
            if($rst[$index_min] > $max)
            {
                $max = $rst[$index_min];
                $index_max = $index_min;
            }
        }
        //检测重复的最大值处理,确保最大值唯一
        /*for($i =0; $i < $n; $i++)
        {
            if($rst[$i] === $max && $i !== $index_max)
            {
                $one_rst = $rst[$i] -1;
                $rst[$i] = $one_rst;
                $rst[$index_max] = $max + 1;
                break;
            }
        }*/

        //重新乱序
        shuffle($rst);
        //查找最大值
        $index_max = 0;
        $max = $rst[0];
        for($i =1; $i < $n; $i ++)
        {
            if($rst[$i]> $max)
            {
                $index_max = $i;
                $max = $rst[$i];
            }
        }
        return $rst;
    }

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 生成GUID
Gavaen
粉丝 0
博文 6
码字总数 1499
作品 0
杭州
后端工程师
私信 提问
PHP随机红包算法

2017年1月14日 14:19:14 星期六 一, 整体设计 算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记录各种需要的数据 二, 红包算法 简便起见, 红包金...

大王回山
2017/01/14
0
0
微信红包指定总金额随机生成每个红包金额算法

红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以“分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]。...

武当剑客
2015/11/24
1K
1
微信红包的随机算法

有人问过微信的人,大致是这样: public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_leftMoneyPack......

背锅侠
2016/02/17
566
0
微信支付现金红包接口

微信红包SDK 现金红包、裂变红包、企业付款本质均为商户和用户之间的转账,微信官方定义其接口时,操作方法类似。 1. 请求URL 现金红包 裂变红包 企业付款 2. 参数说明 字段名 变量名 必填 ...

小帅帅丶
2016/08/23
7
0
微信红包的随机算法是怎样实现的?

摘自知乎 ,答案来自:https://www.zhihu.com/question/22625187/answer/85530416 答案来自:https://www.zhihu.com/question/22625187/answer/85530416 有人问过微信的人,大致是这样: 先上...

北极之北
2016/02/23
2.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Linux下端口转发工具rinetd介绍

linux下简单好用的工具rinetd,实现端口映射/转发/重定向,针对TCP协议,不支持UDP。 官网地址 http://www.boutell.com/rinetd 里面介绍及使用齐全。 使用场景举例: 阿里云内网Redis连接问题...

ouhoo
9分钟前
0
0
Oracle学习日志-5(算数运算符,比较运算符和逻辑运算符)

因为有编程基础,所以对于这一章还是很好理解,只需要注意对NULL的运算。 操作的表格 算数运算符 查询商品名字和商品售价,并商品售价乘2 SELECT product_name,sale_price * 2 AS "sale_pri...

白话
22分钟前
0
0
搜索引擎(Lucene介绍、分词器详解)

Lucene介绍 Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简...

这很耳东先生
27分钟前
0
0
quartz详细介绍

quartz常用api Scheduler 调度程序交互的主要API。 Job 希望由调度程序执行的组件实现的接口。 JobDetail 用于定义作业的实例。 JobDataMap 可以包含不限量的序列化数据,在job运行的时候可以...

大笨象会跳舞吧
27分钟前
0
0
kotlin使用jackson序列化enum

默认情况下,我们序列化与反序列化enum是它的name,事实上大部分情况下我们需要序列化的是我们自定义的value,那应该怎么做呢? 这种情况下我们就需要@JsonValue与@JsonCreator data class U...

weidedong
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部