用 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

相关文章
|
2天前
|
机器学习/深度学习 算法 Python
使用Python实现深度学习模型:演化策略与遗传算法
使用Python实现深度学习模型:演化策略与遗传算法
5 0
|
4天前
|
机器学习/深度学习 存储 算法
心得经验总结:微信红包随机算法转载
心得经验总结:微信红包随机算法转载
|
5天前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
15 4
|
6天前
|
机器学习/深度学习 算法 搜索推荐
Python常用算法详细解释
Python常用算法详细解释
13 0
|
6天前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
6天前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
7天前
|
存储 机器学习/深度学习 算法
Python算法基础教程
Python算法基础教程
|
8天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
90 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
8天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
135 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
9天前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
103 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow