用 Python 实现一个简单的微信红包算法

简介: 基本思路就是,有多少个红包,就循环多少次,每一次,在剩下的钱里面随机出一个值作为这个红包的金额,然后把金额从总金额中扣除。这里要注意,需要保证每个人至少能拿得到 1 分钱。只剩最后一个人时,拿走剩下所有的金额。另外,为了保证计算时候方便,采用“分”作为金额的计算单位。


今年过年各位一定在微信里抢了不少红包。那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写?


这里我给一个简单的实现方案。


基本思路就是,有多少个红包,就循环多少次,每一次,在剩下的钱里面随机出一个值作为这个红包的金额,然后把金额从总金额中扣除。这里要注意,需要保证每个人至少能拿得到 1 分钱。只剩最后一个人时,拿走剩下所有的金额。另外,为了保证计算时候方便,采用“分”作为金额的计算单位。


代码:


import random
def redPacket(people, money):
    result = []
    remain = people
    for i in range(people):
        remain -= 1
        if remain > 0:
            m = random.randint(1, money - remain)
        else:
            m = money
        money -= m
        result.append(m / 100.0)
    return result


redPocket 就是分配红包的函数,people 是红包总个数,money 是总金额(单位:分)。返回值 result 是最终的分配结果,单位换算成了“元”。


其中,为了保证每个人都至少拿到 1 分钱,所以随机数的取值范围为 1 到 money - remain,也就是为剩下的人每人至少预留 1 分钱。


添加一下输入:


people = int(input('红包个数:\n'))
money = int(input('总金额:\n') * 100)
redPocket(people, money)


这里意思一下,不做严格的输入检测了,没有判断金额是否够分,或者超过限额之类。总金额输入的时候是“元”,在代码里再转成“分”来计算。


运行下看结果是否正确。


红包个数:
4
总金额:
30
[13.88, 14.38, 0.18, 1.56]


总和上没有问题,但多跑几次你会发现,前面的人往往比后面的人要多拿,而还多不少。这是因为前面的人有可能在一开始就随机到大金额,而让后面人没有机会。于是我决定再加个限制:


def redPacket(people, money):
    result = []
    remain = people
    max_money = money / people * 2
    for i in range(people):
        remain -= 1
        if remain > 0:
            m = random.randint(1, min(money - remain, max_money))
        else:
            m = money
        result.append(m / 100.0)
        money -= m
    return result


注意增加的 max_money,它是平均金额的 2 倍,也就是说,你有再好的运气,也不会拿到超过两倍均值的红包。这个简单粗暴的限制基本可以解决差值过大的问题。


在随机金额的地方,原本的上限会和 max_money 相比较,取其中较小的一个。


再运行下,结果是不是看上去像那么回事儿了。


这个方法比较容易实现,但从概率上来说并不公平。我觉得另一个更好的方案是,先产生 people 个 0 到 1 之间的随机数,得到这些随机数的总和 s,再通过

x / s * money

得出每一个红包对应的金额。这个方案的代码实现留给你们,注意可能出现小数末位截断的误差。当然你也可以尝试一套自己的方案。


我不知道微信究竟是怎么实现的。但从实际效果来看,他们也并没有对红包之间的差值做过多限制。可能是觉得这样才有意思吧。


知乎上有一个相关问题,里面有更严谨的分析:


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

https://www.zhihu.com/question/22625187

相关文章
|
7月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
7月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
216 5
|
8月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
397 26
|
8月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
366 0
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
556 0
|
8月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
632 4
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
1007 4
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
388 3
|
8月前
|
算法 机器人 定位技术
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
515 4

热门文章

最新文章

推荐镜像

更多