`

微信红包算法

阅读更多

之前一直在思考关于微信的红包算法是如何实现的,就在网上找了很多相关的技术但大都是java写的,了解了其中的原理和思路就自己用php搞搞玩,下面大概总结了2种方法,请大家参考一下:

第一种:二倍均值法

第二种:线段分割法

下面先用2种方法去实现第一种

1.1 方法----------------------------

        $money = 100;  //100元

        $peoples = 10; //10人参与

        $min = 1;//最小金额 1元

        

        $rest_amount = $money;

        $rest_peoples = $peoples;

        $getAmount = 0;

        for($i=0;$i<$peoples;$i++){

            //随机范围:[1,剩余人均金额的两倍),左闭右开

            $lastOne = $peoples - 1;

            if($i != $lastOne){

                

                $getAmount = rand($min, ($rest_amount / $rest_peoples * 2));  //精华

                $res[$i] = $getAmount;

                $rest_amount = $rest_amount - $getAmount;

                $rest_peoples--;

            }else{

                $res[$i] = $rest_amount;  //这边跟他们的不一样(最后一个人是剩余金额,防止不足或超出总金额)

            }

        }

        

        echo '<pre>';

        print_r($res);

        echo array_sum($res);

        die;

大家看一下结果:

结果1


 结果2:


 结论:感觉随机的结果没微信初始的好;再看下面的方法:

        $total=100;//红包总额 

        $num=10;// 分成10个红包,支持10人随机领取

        $min=1;//每个人最少能收到1元 

         

        $data = [];

        for ($i=1;$i<$num;$i++) 

        { 

            $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限   扣除剩余最低金额,一半的最大,随机

            $money=mt_rand($min*100,$safe_total*100)/100; 

            $total=$total-$money; 

            $data[$i] = $money;

        } 

        $data[$num] = $total;

        

        

        echo '<pre>';

        print_r($data);

        echo array_sum($data);

        die;

结果如下:


 或者:


 貌似这种结果还算靠近微信的结果,很少出现1元最低的情况;

//----------------第二种方法(线段分割法)--------------

我们可以把红包总金额想象成一条很长的线段,而每个人抢到的金额,则是这条主线段所拆分出的若干子线段。由“切割点”来决定。当N个人一起抢红包的时候,就需要确定N-1个切割点。

因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。随机的范围区间是(1, M)。

当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。

 

        $total=100;//红包总额

        $num=10;// 分成10个红包,支持10人随机领取

        $min=1;//每个人最少能收到1元

         

        $data = $money = [];

        for ($i=0;$i<$num;$i++)

        {

            $data[$i] = mt_rand($min,$total);

        }

        $sum = array_sum($data);

        $last = $num-1;

        for($k=0;$k<$last;$k++){ //0~8

            $money[$k] = round(($data[$k] / $sum) * $total,2);

        }

        

        $money[$last] = $total - array_sum($money);

        

        echo '<pre>';

        print_r($data);

        echo '<pre>';

        print_r($money);

        echo array_sum($money);

        die;

 结果如下:


 或者


 这个线段分割法感觉数据随机的还凑合,目前就是这两种方法,如有不足请大家多多指教,共同进步,

谢谢

 

 

  • 大小: 1.7 KB
  • 大小: 1.7 KB
  • 大小: 2.1 KB
  • 大小: 2 KB
  • 大小: 4.1 KB
  • 大小: 3.9 KB
分享到:
评论

相关推荐

    weixin_hongbao:微信红包算法

    首先,我们要理解微信红包算法的基本原理。当用户设置一个总金额和红包个数时,系统会按照一定的规则将金额随机分配到各个红包中。这个规则保证了以下几个关键点: 1. **总金额分配**:所有红包的金额之和必须等于...

    php实现的微信红包算法分析(非官方)

    本文实例讲述了php实现的微信红包算法。分享给大家供大家参考。具体如下: 最近一直在微信群里体验红包功能,红包类型有两种: 1. 普通红包 2. 拼手气红包 普通红包就不用多解析了,大锅饭原理,平分。 拼手气红包讲...

    JavaScript实现微信红包算法及问题解决方法

    首先,我们要明确微信红包算法的基本原则:确保每个参与者至少获得0.01元,每个人都有相等的抢红包机会,以及所有红包金额之和必须等于100元。 1. 基本的随机函数实现 最常见的思路是通过随机数生成来分配红包。...

    微信红包拆分

    为了保证公平性,微信红包算法会尽量让最后一个红包的金额不会过大或过小,通常会有一个特殊的“手气最佳”红包,其金额可能略高于或低于平均值,增加了游戏的趣味性。 5. **并发处理**: 在微信红包的实际场景中...

    Python版微信红包分配算法

    ### Python版微信红包分配算法详解 #### 一、引言 微信红包作为一种流行的社交互动方式,在节日或特殊场合被广泛使用。为了使红包分配更加有趣和公平,开发了一种基于数学算法的红包分配方法。本篇文章将详细介绍...

    基于PHP微信红包的算法探讨_.docx

    微信红包的算法探讨是本文的主要内容。本文将探讨微信红包的算法,并提供了 PHP 代码来实现微信红包的发送和接收。 微信红包的算法需要满足以下几点要求: 1. 每个人都要能够领取到红包。 2. 每个人领取到的红包...

    .net版微信红包开发Demo

    《.NET版微信红包开发详解》 微信红包作为微信支付的一种独特功能,深受用户喜爱,其背后的开发技术也引起了广大开发者和技术爱好者的关注。本文将深入探讨基于.NET平台的微信红包开发,帮助开发者理解并掌握如何...

    微信红包程序实现代码

    该程序基本实现了微信红包程序,红包金额为吉利数字,分布比较均匀。 程序解释文章请看 https://blog.csdn.net/weixin_43347550/article/details/105227159 微信红包程序:给定一个钱数m,发红包人数n,其中10, n将...

    微信红包随机生成算法php版

    1. 微信红包算法介绍:微信红包算法是一种随机分配红包金额的方式,能够在保证每个人至少获得一定金额的同时,让红包金额具有随机性和趣味性。它通常有两种类型:普通红包和拼手气红包。普通红包平均分配,拼手气...

    Java代码实现微信红包功能

    在Java编程环境中,微信红包功能的实现涉及到一系列的面向对象设计、接口定义、类继承以及事件处理等技术。下面将详细解析这个项目的关键知识点。 首先,我们要理解微信红包的核心功能,包括红包发放、红包领取、...

    微信红包的架构设计简介

    微信红包采用了一种基于随机算法的实时计算机制,该机制能够在短时间内快速计算出每个红包的具体金额,并将其分发给参与的用户。这种机制可以确保红包的随机性和公平性,同时还能有效减少用户的等待时间。 例如,在...

    微信支付 微信红包 JAVA 几行代码搞定

    微信支付、扫码支付和微信红包是微信提供的便捷移动支付功能,对于开发者来说,能够快速集成这些功能至关重要。本文将详细讲解如何使用JAVA实现微信支付、扫码支付和微信红包的接口调用,以及如何进行验签操作,使得...

    PHP仿微信红包[最佳手气]算法

    * 拼手气红包实现方法[并做手气最佳处理] * 生成num个随机数,每个随机数占随机数总和的比例*money_total的值即为每个红包的钱额 * 考虑到精度问题,最后重置最大的那个红包的钱额为money_total-其他红包的总额 ...

    微信红包源码微信CPA微信抽奖活动推广源码

    7. **红包算法**:微信红包的发放有多种模式,如普通红包(每个红包金额随机)、拼手气红包(总金额随机分配)等。算法的设计直接影响到红包的分配公平性和用户的参与体验。 8. **抽奖逻辑**:抽奖活动通常包含概率...

    模仿微信发红包代码

    微信红包功能的实现涉及到随机算法、并发处理以及数据库操作等多个技术领域。下面,我们将深入探讨这个主题,以"模仿微信发红包代码"为背景,解析其中涉及的关键知识点。 首先,我们需要理解微信红包的基本逻辑。...

    微信红包API事例

    微信红包API事例是微信支付服务中的一个重要组成部分,它允许开发者在自己的应用程序中集成发送和接收红包的功能。这个API主要用于企业或商家与用户之间进行互动,例如节日促销、奖励用户或者进行抽奖活动等。要使用...

    微信发红包开发接口ThinkPHP3.1版本

    本项目基于ThinkPHP3.1框架,为开发者提供了一种简单易整合的微信红包发放解决方案。以下将详细解释相关知识点。 1. **微信红包(WeChat Red Packet)**: 微信红包是微信支付推出的一种社交互动方式,用户可以...

Global site tag (gtag.js) - Google Analytics