微信红包的算法实现

iOS Certificates, Identifiers & Profiles简介 1. Certificates Certificates是生成开发和生产所需的证书。 2.1 certSigningRequest文件 生成证书前,需要先生成certSigningRequest文件,certSigningRequest文件由【钥匙串访问】生成。 选择菜单【钥匙串访问】,【证书助理】下的【从证书颁发机构请求证书…】 填写【用户电子邮件地址: 】,将【请求是:】的选项改为【储存到磁盘】 输入certSigningRequest文件的文件名,并指定保存位置。 保存certSignin 阅读详情

来自:Small

链接:http://blog.cqcoder.com/微信红包的算法实现探讨/

突发奇想给校友微信群发了红包,我设定红包总额为10元,支持28个人随机领取


于是一个有趣的结果出现了


A 领取了 0.26元
B 领取了 0.29元
C 领取了 0.02元
D 领取了 0.56元
E 领取了 0.64元
……


微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论《微信红包的随机算法是怎样实现的?》,链接,https://www.zhihu.com/question/22625187不过他们讨论的太过于深入,有掉坑之嫌。


我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求

1、每个人都要能够领取到红包;

2、每个人领取到的红包金额总和=总金额;

3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;

4、算法一定要简单,不然对不起腾讯这个招牌;


正式编码之前,先搭建一个递进的模型来分析规律


设定总金额为10元,有N个人随机领取:
N=1 
则红包金额=X元; 

N=2 
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 
第二个红包=10-第一个红包金额; 

N=3 
红包1=0.01至0.98之间的某个随机数 
红包2=0.01至(10-红包1-0.01)的某个随机数 
红包3=10-红包1-红包2 

……

至此,规律出现啦!开始编码!

C++

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
    cout<<"\t\t抢红包游戏"<<endl;
    int total;
    double totalnum,Min=0.01;//最少能收到0.01元
    cout<<"输入红包总数和总金额"<<endl;
    scanf("%d%lf",&total,&totalnum);
    srand((unsigned)time(NULL));
    for(int i=1;i<total;++i)
    {
        double safe_total=(totalnum-(total-i)*Min);
        double num1=((rand()%(int(safe_total*100)-int(Min*100)))+int(Min*100))/100.0;
         totalnum-=num1;
        cout<<"第"<<i<<"个红包:\t"<<num1<<"元\t"<<"余额:\t"<<totalnum<<"元"<<endl;
    }
    cout<<"第"<<total<<"个红包:\t"<<totalnum<<"元\t"<<"余额:\t"<<"0元"<<endl;
}
输入一看,波动太大,这数据太无趣了!

                抢红包游戏
输入红包总数和总金额
8 30
第1个红包:      3.76元  余额:   26.24元
第2个红包:      21.59元 余额:   4.65元
第3个红包:      2.61元  余额:   2.04元
第4个红包:      1.96元  余额:   0.08元
第5个红包:      0.02元  余额:   0.06元
第6个红包:      0.02元  余额:   0.04元
第7个红包:      0.02元  余额:   0.02元
第8个红包:      0.02元  余额:   0元

改良一下,将平均值作为随机安全上限来控制波动差

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
    cout<<"\t\t抢红包游戏"<<endl;
    int total;
    double totalnum,Min=0.01;//最少能收到0.01元
    cout<<"输入红包总数和总金额"<<endl;
    scanf("%d%lf",&total,&totalnum);
    srand((unsigned)time(NULL));
    for(int i=1;i<total;++i)
    {
        double safe_total=(totalnum-(total-i)*Min)/(total-i);
        double num1=((rand()%(int(safe_total*100)-int(Min*100)))+int(Min*100))/100.0;
         totalnum-=num1;
        cout<<"第"<<i<<"个红包:\t"<<num1<<"元\t"<<"余额:\t"<<totalnum<<"元"<<endl;
    }
    cout<<"第"<<total<<"个红包:\t"<<totalnum<<"元\t"<<"余额:\t"<<"0元"<<endl;
}
输出结果见下图

                抢红包游戏
输入红包总数和总金额
8 30
第1个红包:      1.36元  余额:   28.64元
第2个红包:      0.86元  余额:   27.78元
第3个红包:      4.13元  余额:   23.65元
第4个红包:      4.93元  余额:   18.72元
第5个红包:      0.49元  余额:   18.23元
第6个红包:      8.85元  余额:   9.38元
第7个红包:      7.6元   余额:   1.78元
第8个红包:      1.78元  余额:   0元




复古与新生:老毛子Padavan固件在旧设备上的现代化应用之旅 本文探讨了如何通过刷入Padavan固件,让小米路由器3G(R3G)等老旧设备重获新生,实现现代化应用。详细介绍了从硬件潜力分析、智能家居中枢搭建,到轻量级服务器部署和网络功能扩展的全过程,为技术爱好者提供了一条低成本、高性能的设备改造之路。 阅读详情

相关推荐

osgEarth添加线特征

部分关键代码: osgEarth::Annotation::FeatureNode* pathNode = 0; osgEarth::Symbology::Geometry* path = new osgEarth::Symbology::LineString(); Track*track = dynamic_cast<Track*>(entity->getProperty(PS_TRACK)); if (track == nullptr) { return; } st.

wb175208的专栏 2966

最全微信红包分配算法,不只是二倍均值那么简单

最全微信红包分配算法1不只是二倍均值那么简单!

SunGlassGreat 1万+

如何在软件复位后保留指定RAM区域的数据

本文主要介绍S32K144的RAM retention功能

北极熊的脖子(16605192620@163.com) 1万+

微信红包分配算法原理

### 微信红包分配算法原理 春节这几天,大家在红包群里抢了不少红包了吧,有没有试过总金额上百的红包抢到手之后只有几毛钱?为什么有些人能抢到总金额的一半甚至更多?下面,我来给大家讲讲微信红包分配的算法原理。

tanjunming2020的博客 8270

Web端百度离线地图3.0实战:从零搭建到私有化部署

本文详细介绍了Web端百度离线地图3.0的完整实战流程,从核心SDK本地化、功能模块下载到地图瓦片部署。通过逐步修改代码与配置,实现在无外网环境下的私有化部署,解决了内网或网络不稳定场景下的地图应用需求,并提供了关键的避坑指南。

n7o8p的博客 714

stm32驱动NRF24L01_原理+代码解析

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。①2.4G全球开放的ISM频段,免许可证使用。②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。③126个可选的频道,满足多点通信和调频通信的需要。④内置CRC检错和点对多点的通信地址控制。⑤可设置自动应答,确保数据可靠传输。//NRF24L01寄存器操作命令。

zyc18700766982的博客 2万+

红包随机算法&微信群红包随机算法

1.前言 因疫情影响,部门 2021 年会以线上直播的形式进行,通过微信小程序展开。为活跃年会氛围,年会直播间会有抢红包环节。因产品要求,红包金额要随机生成,所以这里涉及到指定红包总额、数量和最大最小值情况下如何生成红包金额。 可以看出,红包随机金额生成的输入是一个四元组 <sum, num, min, max>,其中 sum 是红包总额,num 是红包数量,min 和 max 分别是红包最小最大值。所以这里可以抽象成如下算法: input: <sum, num, min, max>

Doublelv 的博客专栏。 7619

统信UOS/麒麟ARM桌面版,不联网也能用Docker部署MySQL 5.7(离线部署详解)

本文详细介绍了在统信UOS/银河麒麟ARM桌面版系统中,如何离线部署MySQL 5.7的完整流程。通过Docker技术实现环境隔离和依赖封装,解决了封闭网络环境下的部署难题,包括资源准备、系统配置、容器化部署及安全加固等关键步骤,为政企和科研场景提供实用解决方案。

weixin_30892037的博客 227

【随机算法1】——微信抢红包的随机算法

通过隔板法,冒泡排序法实现微信抢红包的随机算法

GreyIcesea的博客 2554

MoveIt控制睿尔曼RM65机械臂:从仿真到实机的3种控制模式对比

本文详细解析了使用MoveIt框架控制睿尔曼RM65机械臂的三种核心模式:拖动规划、目标姿态规划和Python API控制,从Gazebo仿真到实机部署的完整实现路径。通过ROS环境配置、控制参数优化及实机过渡技术,为工业自动化和机器人研究提供实用指南。

727

Apache Flink连载(一):Apache Flink是什么?

Apache Flink 是一个框架和分布式处理引擎,用于在。

qq_32020645的博客 1216

微信红包算法以及带上下限的红包算法

微信红包算法以及带上下限的红包算法 原文地址: 带上下限的红包算法实践总结 微信红包的随机算法是怎样实现的? - 知乎 一、微信红包算法 代码大致意思是这样的:假设有100元钱,分给十个人。那么第一个人获得红包大小怎么计算呢?100/10 = 10元。这是期望值。从0.01到20的区间中(其中20=10乘以2)随机抽取一个数,就是第一个人获得红包的大小。假设第一个人获得了15元,那么...

arthur.dy.lee的专栏 2万+

使用R语言读取和处理CSV数据集

查看数据集的结构str(data)# 查看数据集的摘要统计信息str()函数将显示数据集的结构信息,包括变量名称、类型和前几行的值。summary()函数将提供数据集的摘要统计信息,如均值、中位数、最小值、最大值等。

CyberGenius的博客 3855

微信红包算法代码实现

微信红包算法思考学习研究 闲来无事,研究下微信的红包算法,也思考下可以实现的其他算法,略作记录。 微信红包的随机算法不是在发红包时就算好的,而是用户在领取红包时实时计算出客户领取红包金额,因此红包的算法重点在于如何公平地算出领取人领取的红包金额。 可以转换为问题:从资金为S、个数为N的红包池中公平地随机取一个随机数,要求保证每个人都可以领取到红包。 总额随机法 算法描述:假设当前红包池的金额为...

Arbboter的专栏 7985

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

微信红包随机算法探索(含代码实现)

昨天晚上我妈在微信家庭群里发了一个4人拼手气红包,总金额520RMB,本来是一场平平无奇的抢红包事件,直到抢红包结果出现:可以发现,不仅有两个人都抢了200¥,而且很明显的是我们的金额都没有小数点!于是我发了一个小额拼手气红包(4人共10¥),结果出现: 好家伙,不仅有了小数点,还是两位!让我对微信红包随机算法的随机性产生了怀疑,或者说,他在对于出现不同规模金额的红包的情况时,会做相应不同的处理。 于是我开始思考微信红包的随机算法到底是什么样子的,然后就有了今天这篇文章!在Edge上搜索微信红包随机算法,弹

不积跬步,无以至千里 3081

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基于BigDecimal类实现微信红包算法的功能

基于BigDecimal类实现微信红包算法的功能 BigDecimal类 ​ java.math.BingDecimal类从java.math.Number类继承而来,用于表示精度较高的数值类型的封装类型,一般用于精度要求较高的程序中,比如银行账户的金额属性。 他的常见构造器有: java.math.BigDecimal(String s) java.math.BigDecimal(double d) java.math.BigDecimal(long l) java.math.BigDecimal(i

weixin_44510725的博客 271

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

微信抢红包算法实现

字节跳动二面问到了这个问题,小小研究了一下。(ps:微信红包貌似是使用二倍均值法实现的)只讨论金额随机的情况,需要满足规则:方案一:每个人点进来领,金额随机,随机的上限是当前剩余的红包金额。每次抢到的金额 = 随机区间(0,剩余红包金额)分析:这样做的缺陷是越早领越有优势,因为每次抢到的金额 = 随机区间(0,剩余金额),越早抢能领到的平均金额越大。假设有 10 个人,红包总金额 100,第一个人的随机范围是(0,100),平均金额 = 50;假设第一个人随机到 50 元,第二个人的随机范围就是(0,50)

学习 & 分享 ~ 3005

微信红包算法 java_java模拟实现微信红包算法

本文实例为大家分享了java实现微信红包算法的具体代码,供大家参考,具体内容如下实现过程1.代码如下(示例):import java.math.BigDecimal;import java.util.ArrayList;public class GenRedPacket {static ArrayList list = new ArrayList();;public static BigDecim...

weixin_29707757的博客 540

最全解密微信红包随机算法(含代码实现)

code小生一个专注大前端领域的技术平台公众号回复Android加入安卓技术群“本文内容编写时,参考了网上的资料,详见“参考资料”部分,感谢分享者。。本文已同步发布于52im社区:h...

weixin_38754349的博客 9360

php 红包算法,PHP语言:实现微信红包拆分算法

本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。·修复最后一个红包输出未保留2位数·修复领取的红包金额低于最小红包限制* 红包分配算法** example* $coupon = new Coupon(200, 5);* $res = $coupon->handle();* print_r($r...

weixin_40003780的博客 386

python微信红包代码_用Python实现一个简单的微信红包算法

今年过年各位一定在微信里抢了不少红包。那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写?这里我给一个简单的实现方案。基本思路就是,有多少个红包,就循环多少次,每一次,在剩下的钱里面随机出一个值作为这个红包的金额,然后把金额从总金额中扣除。这里要注意,需要保证每个人至少能拿得到 1 分钱。只剩最后一个人时,拿走剩下所有的金额。另外,为了保证计算时候方便,采...

weixin_39947306的博客 3123

算法:微信拼手气红包的红包金额分配算法的Java实现

微信拼手气红包,大家都体验过吧,多的就不说了,直接上代码: import java.util.*; /** * 微信红包金额分配 * @Author: LiYang * @Date: 2019/9/7 13:33 */ public class RedPacketPuzzle { /** * 微信拼手气红包金额分配方案(输出结果为分,一分钱的分) * @pa...

weixin_39448458的博客 3214

php 红包算法教程,php仿微信红包分配算法的实现方法

php仿微信红包分配算法的实现方法本文实例讲述了php仿微信红包分配算法的实现方法。分享给大家供大家参考,具体如下:/*** 红包分配:把一定金额随机分配给指定人数** @param int $money 用于分配的金额* @param int $num 分配人数*/function RandomMoney($money, $num) {echo "$money元随机分成$num份分别是:";$r...

weixin_39769039的博客 357

微信红包的随机算法是怎样实现的?

微信红包的随机算法是怎样实现的?

TheSamaritan-City 1478

微信抢红包算法 java_java实现微信抢红包算法

简介网上说的有两种比较公平的算法,一种是二倍均值法,一种是线段切割法。下面我们介绍下两种算法的实现:二倍均值法原理剩余红包金额M,剩余人数N,那么:每次抢到金额=随机(0,M/N*2)保证了每次随机金额的平均值是公平的假设10人,红包金额100元第一人:100/10*2=20,随机范围(0,20),平均可以抢到10元第二人:90/9*2=20,随机范围(0,20),平均可以抢到10元第三人:80/...

weixin_42309311的博客 630

微信红包随机数字_微信红包生成算法的实现

一、微信红包算法要求实现是一个微信红包生成的算法,通过提供一个总金额,以及红包数,要求根据红包总数随机生成金额不等的红包,并输出;要求输出的每个红包金额总和要等于总金额,要求最低金额不能少于0.01元。微信红包算法代码public class RedPacket { /**总金额*/ private String sumMoney; /**红包总数*/ private int...

weixin_35673021的博客 2351
上一篇: Homework 贪心(排序)
下一篇: 手机的九宫格图形解锁算法(判断是否合法)
MagicScaring
博客等级 码龄11年 18粉丝 28原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值