微信抢红包代码 python_用 Python 实现一个简单的微信红包算法
今年过年各位一定在微信里抢了不少红包。那么当别人是手气王而你只抢到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
Crossin的编程教室
微信ID:crossincode
论坛:http://bbs.crossincode.com
QQ群:465369080
点击左下角“阅读原文”,查看更多学习资源
微信抢红包代码 python_用 Python 实现一个简单的微信红包算法相关推荐
- 基于内容推荐python_用 Python 实现一个简单的基于内容的推荐引擎
原标题:用 Python 实现一个简单的基于内容的推荐引擎 (点击上方公众号,可快速关注) 英文:Chris Clark 译文:伯乐在线专栏作者 - yaoyujia 链接:http://python ...
- python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)&q ...
- python微信抢红包代码_用Python实现微信自动化抢红包,再也不用担心抢不到红包了...
1. 概述 刚刚收到了两个消息,一个好消息,一个坏消息. 先说好消息,好消息就是微信群里有人要发红包,开心~ 不过转念一想,前几次的红包一个都没抢到,这次???不由自主的叹了一口气 ... 过了一会, ...
- python程序30行_30行Python代码,打造一个简单的微信群聊助手,简单方便
大家都知道,最近代码君迷上了Python,一直在研究这门语言,还是那句话,人生苦短,我学Python,今天代码君要教大家一个黑科技,30行代码实现自己定制的微信群聊助手,这个助手有什么用呐,就是用来活 ...
- 用python写一个自动群发微信脚本
使用 Python 写一个自动群发微信脚本需要使用微信第三方 API 来实现.推荐使用 itchat 库,它提供了简单易用的 API,可以方便地编写微信自动化脚本. 首先,你需要安装 itchat 库 ...
- python画哆啦a梦图片_80行代码!用Python做一个哆来A梦分身
原标题:80行代码!用Python做一个哆来A梦分身 对于分身术,大家想必都或多或少的从<火影忍者>的动漫上看到过,炫酷的影分身场面,每每看到都觉得非常过瘾. 今天, 小编其实是蓝胖子的铁 ...
- python 制作自己的新闻_新闻-十行代码,用Python做一个迷你版的美图秀秀
十行代码,用Python做一个迷你版的美图秀秀 2020-02-28 10:16:08 作者: 匿名 浏览量:65次 美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让 ...
- python实现一个简单的远程监控,看看你老婆微信都在聊啥。
python实现一个简单的远程监控,看看你老婆微信都在聊啥. 1.pywin32模块检测活动窗口 2.PIL模块截图 3.http.server.socketserver开启一个临时web服务. 4. ...
- 4、python简单线性回归代码案例(完整)_python 实现一个简单的线性回归案例
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : 自实现一个线性回归.py # @Author: 赵路仓 # @Date : 2020/4 ...
最新文章
- Mysql之外连接_OUTER JOIN
- DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义
- Guice进阶之整合mybatis和druid
- 60分钟快速入门PyTorch
- 域名,端口,IP总结
- 神经元的结构示意图手绘,神经元的结构图手绘
- Codeforces Beta Round #94 (Div. 1 Only)A. Statues
- “此电话号码无法用于进行验证”的解决方法
- 【cocos2d游戏开发实战】一款射击类小游戏《Zombie Age》的开发(一)
- 什么电脑录音软件是最好用的
- 计算机数值中的乘法除法原理
- mysql安装所需最低配置数据_MySQL的安装与基本配置
- Google服务和软件大全
- Gazebo仿真进阶教程之传感器高斯噪声(二)
- java接口如何有效防止恶意请求
- 2021年美国大学生数学建模竞赛C题参考翻译
- 2007林肯公园上海演唱会观后感(实况像片/MP3) update:2008.1.31
- html如何调用短视频文件,短视频脚本怎么写?3种短视频脚本的创意写作方法干货分享!...
- 关于放大器失真的原因你了解多少呢?
- jquery插件手风琴效果
热门文章
- 流氓软件 电脑软件管家
- 中国海洋大学2022CTF校赛
- graphpad如何检测方差齐_看过来!GraphPad软件中的单因素方差分析这样用
- XGBoost(极端梯度提升)算法原理小结
- WiFiSpoof for Mac(wifi地址修改工具)
- access的查询导致长文本数据缺失_Access常见错误及解决方案
- 武田将在即将召开的虚拟科学大会上呈报数据,强调肿瘤产品阵容和后续产品管线的广度
- 2018《财富》世界500强出炉,比500强更多的财富在这里!
- 币乎作者@骄阳在天 | Conflux的崛起之路
- C语言电话号码判断合法性