可控概率抽奖算法

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

说明

本文PHP语言去实现,只实现核心可控概率引擎,库存判断等其它业务需要其它代码配合实现。

代码

/**
 * @function 封装可控概率的抽奖功能
 * @param    $arr        array  数据集合
 * @param    $weight_key string 权重字段
 * @return   array       被选中的元素
 */
function controllableProbability($arr, $weight_key = 'weight') {
    $total_probability = 0;
    foreach($arr as $v) {
        $total_probability = bcadd($total_probability, $v[$weight_key], 2);
    }
    $rand = mt_rand(1, intval($total_probability));
    foreach ($arr as $val) {
        if ($rand <= $val[$weight_key]) {break;}
        $rand -= $val[$weight_key];
        next($arr);
    }
    //想要返回key,使用return key($arr);
    return current($arr);
}

调用

  1. weight权重概率字段,不是概率字段,不需要总和为100
  2. 如下,代表16个人抽奖,有10人是谢谢惠顾,有5人中2元,有1人中5元,有0人中50W。
$arr = [
    ['id' => 1, 'name' => '谢谢惠顾', 'weight' => 10],
    ['id' => 2, 'name' => '中2元', 'weight' => 5],
    ['id' => 3, 'name' => '中5元', 'weight' => 1],
    ['id' => 4, 'name' => '中50W', 'weight' => 0],
];
//参数1是数组,参数2是告诉controllableProbability函数哪个字段为改概率字段
controllableProbability($arr, 'weight');

验算

$a = 0; $b = 0; $c = 0; $d = 0;
for($i = 0; $i < 1600000; $i++) {
    $res = controllableProbability($arr, 'weight');
    if($res['id'] == 1) $a ++;
    if($res['id'] == 2) $b ++;
    if($res['id'] == 3) $c ++;
    if($res['id'] == 4) $d ++;
}
echo "$a $b $c $d";

3轮抽奖,每轮抽160万次,可得以下表格:

轮次 谢谢惠顾实际次数 谢谢惠顾期望值 中2元实际次数 中2元期望值 中5元实际次数 中5元期望值 中50W实际次数 中50W期望次
1 999323 1000000 500374 500000 100303 100000 0 0
2 1001144 1000000 498732 500000 100124 100000 0 0
3 999285 1000000 500662 500000 100053 100000 0 0

以谢谢惠顾为例纵向对比:

项目 第一轮 第2轮 第3轮
谢谢惠顾实际次数 999323 1001144 999285
谢谢惠顾期望次数 100000 100000 100000
谢谢惠顾实际概率 62.46% 62.57% 62.46%
谢谢惠顾期望概率 62.50% 62.50% 62.50%
误差率 -0.04% +0.07% -0.04%

技术上:随机范围可控,但是随机值不可控,随机值可控就不叫随机了,有误差正常,本来随机就是个概率问题。
业务上:可通过库存的限制和其它业务逻辑来避免误差带来的问题。
数值上:若硬要实现0误差的精确控制,则需要动态获取权重值,抽中哪条数据,递减那条数据的权重值即可(同时要避免mt_rand();函数参数2小于参数1的情况出现)。文章来源地址https://www.toymoban.com/news/detail-824996.html

到了这里,关于可控概率抽奖算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 含源码|基于MATLAB的去雾系统(5种去雾算法+1种本文的改进算法)

    含源码|基于MATLAB的去雾系统(5种去雾算法+1种本文的改进算法)

    去雾系统V2包括作者新加入的 多尺度Retinex去雾算法以及改进去雾算法 ,以及 4种 评价去雾效果的 客观指标 。 引言 去雾系统新增功能 结果分析 源码获取 展望 参考文献 在作者前面写过的文章中,已经介绍过图像去雾算法的应用价值及研究现状,并且也介绍了4种去雾算法的

    2024年01月23日
    浏览(9)
  • 不得不读 | 深入浅出ControlNet,一种可控生成的AIGC绘画生成算法!

    不得不读 | 深入浅出ControlNet,一种可控生成的AIGC绘画生成算法!

    ControlNet,控制预训练大型扩散模型,以支持额外的输入条件。ControlNet以端到端方式学习特定任务的条件输入,即使训练数据集很小( 50k),效果也很健壮。 此外,训练ControlNet的速度与微调扩散模型一样快,而且该模型可以在个人设备上训练。或者,如果强大的计算集群可用,

    2024年02月02日
    浏览(15)
  • Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

    Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

    论文链接:https://arxiv.org/abs/2205.14217 代码链接:https://github.com/XiangLi1999/Diffusion-LM 无需重训模型控制语言模型的表现是自然语言生成(NLG)的一个重要开放问题,近期工作已经在简单句子属性控制生成上取得了一定的进展,但是在复杂的、细粒度的控制上的进展还远远不够。

    2023年04月09日
    浏览(14)
  • KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

    KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

    KMP 是一个 解决模式串在文本串是否出现过 ,如果出现过,最早出现的位置的经典算法。 Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于 在一个文本串 S 内查找一个模式串 P 的出现位置 ,这个算法由 Donald Knuth 、 Vaughan Pratt 、 James H. Morris 三人于 1977 年联合发表

    2024年02月07日
    浏览(10)
  • 微信小程序抽奖 简单功能实现

    抽奖是一种常见的互动活动,在微信小程序中也有很多不同的实现方式。以下是一份简单的微信小程序抽奖源码,供参考:在 wxml 文件中添加抽奖的页面布局: 在js 文件中添加抽奖逻辑: 实现了一个简单的地奖功能,用户点击“开始抽奖“按知后,抽奖结里会从奖品列表中贿机

    2024年02月16日
    浏览(50)
  • 用Python实现概率矩阵分解(PMF)算法在MovieLens ml-100k数据集上构建精确的推荐系统:深入理解GroupLens数据的操作

    第一部分:推荐系统的重要性以及概率矩阵分解的介绍 在如今的数字化时代,推荐系统在我们的日常生活中起着重要的作用。无论我们在哪个电商网站上购物,哪个音乐平台听歌,或者在哪个电影网站看电影,都会看到推荐系统的身影。它们根据我们的喜好和行为,向我们推

    2024年02月15日
    浏览(12)
  • html+css+js实现转盘抽奖

    html+css+js实现转盘抽奖

     

    2024年01月25日
    浏览(13)
  • Unity简单实现老虎机抽奖效果

    Unity简单实现老虎机抽奖效果

    Unity:2019.4.36 VS:2017 1、右键—UI—RawImage (自己摆好位置并设置好大小,然后选择图片,挂载RawImageTest脚本。本案例需要创建6个RawImage,分别是一个背景图片、三列水果和两块遮板,背景图片必须放在最上面) 2、右键—UI—Button (同样自己摆好位置并修改大小,然后修改一

    2024年02月16日
    浏览(7)
  • 【Qt】三种方式实现抽奖小游戏

    【Qt】三种方式实现抽奖小游戏

    简介 本文章是基本Qt与C++实现一个抽奖小游戏,用到的知识点在此前发布的几篇文章。 下面是跳转链接: 【Qt控件之QLabel】用法及技巧 链接: https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm=1001.2014.3001.5501 【Qt控件之QPushButton】用法及技巧 链接: https://blog.csdn.net/MrHHHHHH/article

    2024年02月07日
    浏览(11)
  • 三种爱心代码html(文本文档即可实现)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包