python抢红包程序算法,Python 抢红包算法模拟
抢红包算法模拟
本篇内容为抢随机红包模拟算法,仅供参考。
方法
本篇使用的是二倍均值法,在此之前,先大概讲下普通随机法。
普通随机方法
该方法的原理是:每次都以 [最小值,剩余金额值] 之间进行随机取值。
假设红包金额为 88.88,红包数量为 8 个,那么第一个人领取金额将从 [0.01, 88.88] 之间进行取值,假设取值为 20.20,那么剩余的金额为 68.68。
第二个领取金额将从 [0,01, 68.68] 之间进行取值,以此类推…
这里可以明显看出此方法的弊端,前面领取红包的金额区间更大,也就更容易获取更大的红包金额。下面看二倍均值法的原理。
二倍均值法
方法实现的原理是:每次以 [最小值,红包剩余金额 / 人数 * 2] 的区间进行取值。
假设红包金额为 88.88,红包数量为 8 个,理想情况下,方法的实现效果:
第一个人领取红包金额区间为 [0.01, 88.88 / 8 * 2],即是 [0.01, 22.22] 之间随机获取金额数。假设取平均值 11.11,则剩余金额 77.77;
第二个人领取红包金额区间为 [0.01, 77.77 / 7 * 2],即是 [0.01, 22.22] 之间随机获取金额数。假设取平均值 11.11,则剩余金额 66.66;
以此类推…
该方法也不是完美的,上述是非常理想情况下红包的领取金额,同时每个人获取金额区间相对公平。但是当其中一个人在区间取值接近最小值或者最大值都会对后面的区间造成影响。当取到接近最小值时,后面领取红包金额区间将会变大;反之,则变小。这也是该方法的弊端。
代码实现
# -*- coding: utf-8 -*-
'''
@File: red_packet.py
@Time: 2020/01/29 20:41:36
@Author: 大梦三千秋
@Contact: yiluolion@126.com
'''
# Put the import lib here
import random
def get_random_red_packet(total_amount, quantities):
'''抢红包函数
Args:
total_amount: 红包总金额
quantities: 红包个数
Returns:
返回每人领取红包的金额数
'''
# 用以存储每个人领取的红包金额
amount_list = []
# 抢红包人数
person_num = quantities
# 涉及红包金额可带 2 位小数部分
# 使用先乘 100 计算,再除 100 处理小数点部分
cur_total_amount = total_amount * 100
# 这里采用的是二倍均值法
# 除最后一人,先对前面领取红包金额进行处理
# 最后剩下的金额,即是最后一人的金额
for _ in range(quantities - 1):
amount = random.randint(1, cur_total_amount // person_num * 2)
# 每次减去当前随机金额,用剩余金额进行下次随机获取
cur_total_amount -= amount
person_num -= 1
amount_list.append(amount / 100)
amount_list.append(cur_total_amount / 100)
# print(sum(amount_list))
return amount_list
def main():
amount_list = get_random_red_packet(88.88, 8)
for amount in amount_list:
print('红包金额:{}'.format(amount))
if __name__ == "__main__":
main()
实现效果
红包金额:18.64
红包金额:10.32
红包金额:9.82
红包金额:9.72
红包金额:5.11
红包金额:19.16
红包金额:15.15
红包金额:0.96
延伸
线段切割法
该方法的思路是:把红包总金额当成一条线段,每个人领取红包金额即是该线段拆分的子线段。
当红包数量为 i 时,也就是 i 个人抢红包。对线段进行切割,确定 i - 1 个切割点。
当切割点确定,也就是子线段长度确定。领取红包时只需依次领取子线段对应金额数即可。
以上就是本篇的主要内容
欢迎搜索关注微信公众号《书所集录》
python抢红包程序算法,Python 抢红包算法模拟相关推荐
- 【有趣的Python小程序】Python多个简单上手的库制作WalkLattice 走格子游戏 (思路篇)上
篇写上一个思路篇,那么今天我们就来完成这一项工作 源代码和配套文件 链接: https://caiyun.139.com/m/i?135ClY1yWrSKX 提取码:e4pq 复制内容打开中国移动云盘 ...
- python安卓程序,python软件安卓版
大家好,小编来为大家解答以下问题,python3安卓版下载,python软件安卓版,现在让我们一起来看看吧! 1.如何用手机编程Python? 1.QPython3:这是一个在上运行python3的脚 ...
- 【开发环境】Mac 中删除 Python ( 删除 Python 框架 | 删除 Python 应用程序 | 删除 Python 链接 )
文章目录 一.删除 Python 框架 二.删除 Python 应用程序 三.删除 Python 链接 一.删除 Python 框架 首先到 /Library/Frameworks/Python.fr ...
- python简单程序实例-python简单项目实例
语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pytho ...
- python基础程序实例-Python基础的初始
1.初始Python 1. pythonde 发展历史 自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程. Python的创始人为荷兰人吉多·范罗苏姆 ...
- 【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)
运筹优化博士,只做原创博文.更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37 最近写了几个Pyt ...
- python制作程序菜单,Python 开发:制作一个简易的点菜系统(附源码)
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于海唤鱼杂记客栈 ,作者:海唤鱼杂记客栈 Python GUI编程:高 ...
- python运行程序-用Python执行程序的4种方式,编程必备
在编写代码中,经常会遇到在 Python程序中打开外部程序的需求,那么在Python里如何打开外部程序呢?今天我们来介绍四种不同的方式,供大家参考收藏. 使用 os.system() os.syste ...
- python表白程序-用Python做一个表白小姐姐的程序
今天来填昨天自己给自己挖的那个坑,用Python实现那个曾经抖音上很火的.表白小姐姐程序,自己写了一个简单版本的,基本功能都可以实现,撩小姐姐怕是有点困难,但单身狗们还是可以自娱自乐一下的. 首先讲一 ...
- python小程序-【Python精华】100个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...
最新文章
- python使用kafka原理详解真实完整版_转:Kafka史上最详细原理总结 ----看完绝对不后悔...
- 计算机科学专业毕业?这是给你的职业建议(亮点在最后)
- 你的大脑里有AI吗?
- Android View系统解析(上)
- fastjson jsonobject 转bean失败_烫发以后丑的不行?张柏芝、范冰冰、Angelababy也经历过的失败烫发造型回顾-非主流发型-发型站...
- 冒险实施SAP HANA 农夫山泉缘何做第一个“吃螃蟹”者?
- python plot方法的使用_【python】matplotlib.pyplot入门
- 在JAX-RS中使用@Context [第1部分]
- 那个陪你聊微信、发自拍的妹子,可能不是人
- 【Objective-C】Http常用API、同步请求与异步请求[转]
- Python Lambda 的简单用法
- 使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件
- 火星人学习第二周——虚幻引擎蓝图应用与开发
- 计算机专业保研预推免面试记录
- 电脑风扇转一下停一下开不了机解决方案
- 【手机跳板 多款软件测试】图文演示!
- 微信小程序云开发云数据库_聚合操作_联表查询_对象数组某字段与另一集合的某字段相等匹配
- 数组中重复的元素(剑指Offe.03)
- 二手交易app开发可以定制哪些功能
- 操作系统期末总复习——绝地求生版
热门文章
- 出现找不到sct文件解决方法:.\Objects\MyFirstExample.axf: error: L6031U: Could not open scatter descript
- python工作遇到的问题_工作中遇到的问题收集--.NET
- python中常数e_常数python_python 常数_python 常数e - 云+社区 - 腾讯云
- java石头剪刀布思路_石头剪刀布Java实现
- 2017年计算机二级考试的word的答案,2017年3月全国计算机考试等级考试二级《MS Office高级应用》真题及答案...
- 强化学习笔记3-Python/OpenAI/TensorFlow/ROS-规划博弈
- linux 1060显卡,Ubuntu 16.04 安装 NVIDIA GeForce GTX 1060 显卡驱动,以及 CUDA 10.1
- IOS 视频直播常用集成
- 信用社pb通用记账_信用社会计记账采用的是()。A、收付实现制B、权责发生制C、借贷记账法D、单式记账法...
- 对Spring IOC的理解