抢红包随机金额算法(均衡随机)

这篇具有很好参考价值的文章主要介绍了抢红包随机金额算法(均衡随机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最优算法在文末,欢迎参考。
编写抢红包随机算法功能,通常金额是红包支付后立马算好的,而不是抢一个实时随机一个红包金额,避免并发情况下降低性能。

需求

仿照微信发红包功能,现有n个人抢金额为m的红包,m>=0.01,n>0,m/n不能小于0.01,需保证每个人都能抢到最低为0.01的金额,金额随机,但金额相对均衡

解决方案

无限制随机(不可取)

假设:10个人抢100元的红包。
操作:前几人无限制随机0.01到最大金额,最后一人兜底剩余金额。
结论:这种算法很不稳定,导致前几人分的很多,后面的人没钱分或者很少分的情况,容易出现极端现象。

function red_envelope($money, $person) {
    for($i = 1; $i <= $person; $i++) {
        if($person === $i) {
            $res[$i]  = $money;
        } else {
            if($money <= 0) {
                $res[$i] = 0;
            } else {
                $res[$i] = bcdiv(mt_rand(1, bcmul($money, 100)),100, 2);
                $money = bcsub($money, $res[$i], 2);
            }
        }
    }
    return $res;
}

演进:均衡分配(凑合)

假设:3个人抢20元的红包。
操作:甲抢到6.66,乙抢到6.66,丙兜底抢剩余的的6.68。
结论:算法简单,但随机性差点。

function red_envelope($money, $person) {
	$div = bcdiv($money, $person, 2);
	for($i = 1; $i <= $person; $i++) {
		$res[$i] = $person === $i ? $money - $div * ($i - 1) : $div;
	}
	return $res;
}

演进:递减法(不可取)

假设:10个人抢100元的红包。
操作:第一个人在0.01-99.1之间,预扣的0.09是供其它9个人使用的,假设第一个人抢了70,那么第二个人就是0.01到(100-70-(8 * 0.01))之间的随机数,最后一人兜底剩余金额。
结论:这种算法仍旧不公平,越到后面,金额越少,导致后面的人没钱分或者很少分,容易出现极端现象。

function red_envelope($money, $person) {
    for($i = 1; $i <= $person; $i++) {
        if($i != $person) {
            //剩余金额 = 总金额 - (最小值 * (总人数 - 当前人数))
            $residue_money = bcsub($money, bcmul(0.01, bcsub($person, $i, 2), 2), 2);
            $res[$i] = bcdiv(mt_rand(1, bcmul($residue_money, 100, 2)), 100, 2);
            $money = bcsub($money, $res[$i], 2);
        } else {
            $res[$i] = $money;
        }
    }
    return $res;
}

演进:无序递减法(不可取)

假设:10个人抢100元的红包。
操作:把上一个方法的顺序打乱。
结论:这种算法仍旧不公平,导致任意某人可能没钱分或者很少分,容易出现极端现象。

$res = red_envelope(100, 10, 0.01);
shuffle($res);

演进:二倍均值法(推荐)

假设:假设10个人抢100元红包。
操作:取0.01~(剩余金额 / 剩余人数 * 2)之间的随机数(2为常数,用于影响结果使其趋向平均值),最后一人兜底剩余金额。
结论:二倍均值法理论上可实现相对均衡的随机金额。

function red_envelope($money, $person) {
    $arr   = [];
    for($i = 0; $i < $person; $i ++) {
        $arr[$i] = $money;
        if($person !== ($i + 1)) {
            $arr[$i]  = bcdiv(mt_rand(1, intval($money / ($person - $i) * 200)), 100, 2);
            $money = bcsub($money, $arr[$i] , 2);
        }
    }
    return $arr;
}

理想情况下平均每人金额在10元上下,以下是模拟:文章来源地址https://www.toymoban.com/news/detail-824995.html

第几人 下限随机金额 上限随机金额 上限随机金额算法 理论平均金额 实际随机金额
1 0.01 20.00 100 / 10 * 2 10.00 12.25
2 0.01 19.50 87.75 / 9 * 2 9.76 6.87
3 0.01 20.22 80.88 / 8 * 2 10.12 11.22
4 0.01 19.90 69.66 / 7 * 2 9.96 10.01
5 0.01 19.88 59.65 / 6 * 2 9.95 0.85
6 0.01 23.52 58.80 / 5 * 2 11.77 19.56
7 0.01 19.62 39.24 / 4 * 2 9.81 4.23
8 0.01 23.34 35.01 / 3 * 2 11.68 9.85
9 0.01 25.16 25.16 / 2 * 2 12.59 12.59
10 12.57

到了这里,关于抢红包随机金额算法(均衡随机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】遗传算法GA寻优xgboost最优参数模型

    需求:实现遗传算法GA寻优xgboost最优参数模型搭建 遗传算法(Genetic Algorithm)是一种 通过模拟生物进化过程来解决优化问题的算法 。它模拟了自然界中的遗传、变异和选择等过程,并通过不断迭代寻找最优解。 并行性强 遗传算法可以应用并行计算技术,同时对多个个体进行

    2024年02月12日
    浏览(39)
  • 最优传输问题与Sinkhorn算法

    最近看到一篇特征匹配相关的论文,思想是将特征匹配问题转化为最优传输问题求解,于是我去学习了一下最优传输问题。 本文主要是对博文 Notes on Optimal Transport 的学习做一个记录总结,该博文写的不错,推荐阅读。 文章作者以一个简单的甜点分配例子引入了最优传输问题

    2024年02月03日
    浏览(43)
  • 算法进阶指南图论 最优贸易

    C C C 国有 n n n 个大城市和 m m m 条道路,每条道路连接这 n n n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m m m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 1 1 条。 C C C 国幅员辽阔,各

    2024年02月19日
    浏览(38)
  • 最优化:建模、算法与理论(优化建模)

    目前在学习 最优化:建模、算法与理论这本书,来此记录一下,顺便做一些笔记,在其中我也会加一些自己的理解,尽量写的不会那么的条条框框(当然最基础的还是要有) 本章将从常用的建模技巧开始,接着介绍统计学、信号处理、图像处理以及机器学习中常见的优化模

    2024年02月10日
    浏览(192)
  • 最优化:建模、算法与理论(优化建模——2)

    聚类分析是 统计学中的一个基本问题,其在机器学习,数据挖掘,模式识别和图像分析中有着重要应用。聚类不同于分类,在聚类问题中我们仅仅知道数据点本身,而不知道每个数据点具体的标签。聚类分析的任务就是将一些无标签的数据点按照某种相似度来进行归类,进而

    2024年02月09日
    浏览(51)
  • 最优化:建模、算法与理论(典型优化问题

    4.1.1 基本形式和应用背景 再次说明一下,其实这本书很多的内容之前肯定大家都学过,但是我觉得这本书和我们之前学的东西的出发角度不一样,他更偏向数学,也多一个角度让我们去理解 线性规划问题的一般形式如下: min ⁡ x ∈ R n c T x s . t . A x = b G x ≤ e (4.1.1) min_{x{

    2024年02月09日
    浏览(271)
  • MATLAB利用遗传算法求取最优解

    MATLAB内置GA函数,用以求解全局最优化问题,适用于求解目标函数最优解问题。 常用的两种分别是: 1.X = ga(fitnessfcn,nvars) 2.X = ga(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options) 其中,fitnessfcn为适应度函数(也就目标函数),其参数为向量,nvars是参数向量的维度,函数返回值X为适应度

    2024年02月08日
    浏览(39)
  • 【最优化算法】基于【MATLAB】的最速下降仿真

    无约束问题的求解过程一般都是通过一系列的一维搜索来实现,搜索方向的不同,形成了不同的最优化方法。这篇文章从最速下降法入手,来进行搜索。 最速下降法又叫梯度法,通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。如果我们需要求解损

    2024年02月05日
    浏览(44)
  • 【贪心法】最优前缀码(Huffman哈夫曼算法)

    在计算机中需要用0-1字符串作为代码来表示信息,为了正确解码,必须要求任何字符的代码不能作为其他字符代码的前缀,这样的码称为 二元前缀码。 二元前缀码的存储通常采用二叉树结构,令每个字符作为树叶,对应这个字符的前缀码看作根到这片树叶的一条路径,规定

    2024年02月03日
    浏览(49)
  • 【动态规划】最优二叉搜索树——算法设计与分析

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 规定树根为第0层,圆结点为数

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包