当前位置:首页 > 文章中心 > 正文内容

Python技巧!3分钟学会永不重复的随机点名和微信红包算法

dgx6663个月前 (03-18)文章中心8

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。

前期基础教程:

「Python3.11.0」手把手教你安装最新版Python运行环境

讲讲Python环境使用Pip命令快速下载各类库的方法

Python启航:30天编程速成之旅(第2天)-IDE安装

【Python教程】JupyterLab 开发环境安装


前言

在职场和校园中,随机点名红包分配是高频需求!你是否遇到过传统工具功能单一、分配不公的痛点?本文用Python打造两大神器,代码可直接复制使用,更有超详细原理拆解,新手也能秒懂!


一、永不重复的随机点名器

1.1 场景痛点

老师上课点名总重复?晨会抽奖有人连续中奖?核心需求:公平随机,且不连续选中同一人!

1.2 代码实现

import random

class RandomRollCall:
    def __init__(self, candidates):
        self.candidates = candidates  # 候选人名单
        self.last_pick = []        # 记录上一次选中的人

    def pick(self):
        # 排除上一次选中的人,生成候选名单
        valid_list = [name for name in self.candidates if name not in self.last_pick]

        # 如果候选名单为空(如只有1人),则重置为原始名单
        if not valid_list:
            valid_list = self.candidates.copy()
        # 随机选择并更新记录
        chosen = random.choice(valid_list)
        self.last_pick.append(chosen)

        return chosen

1.3 案例演示

场景1:课堂点名

students = ["小明", "小美", "张三", "李四", "王五"]
roll_call = RandomRollCall(students)

# 模拟连续点名5次
for _ in range(5):
    print(roll_call.pick())

运行结果:

场景2:仅1人特殊情况

single = ["CEO"]
roll_call = RandomRollCall(single)
print(roll_call.pick())  # 输出:CEO
print(roll_call.pick())  # 仍输出:CEO(因无其他人可选)

运行结果:

1.4 原理精讲

  • 动态候选名单:每次排除上次结果,确保不重复
  • 自动重置机制:当候选名单为空时恢复原始名单,避免报错

二、微信同款拼手气红包算法

2.1 需求拆解

  • 金额约束:每人至少0.01元,总和等于总金额
  • 随机性:金额波动大,增加趣味性

2.2 代码实现(微信同款思路)

def wechat_red_envelope(total, num):
    # 将金额转为分计算,避免浮点误差
    total_cents = int(round(total * 100))
    if num <=0 or total_cents < num * 1:
        raise ValueError("金额过少或人数错误")
    
    amounts = []
    remaining_cents, remaining_num = total_cents, num
    
    # 为前n-1人随机分配金额
    for _ in range(num - 1):
        # 核心算法:随机上限=剩余金额-剩余人数*1分(保证后续分配)
        max_amt = remaining_cents - (remaining_num - 1) * 1
        current_amt = random.randint(1, max_amt)
        amounts.append(current_amt)
        remaining_cents -= current_amt
        remaining_num -= 1
    
    # 最后一人拿剩余金额
    amounts.append(remaining_cents)
    random.shuffle(amounts)  # 打乱顺序,避免越后面金额越小
    
    # 转换回元,并保留两位小数
    return [amt / 100.0 for amt in amounts]

2.3 案例演示

场景1:5人抢50元红包

result = wechat_red_envelope(50, 5)
print("分配结果:", result)
print("验证总和:", sum(result))  # 输出:50.0

输出示例

场景2:极端测试(0.02元分3人,每人不足0.01元)

result = wechat_red_envelope(0.02, 3)
print("分配结果:", [round(amt, 2) for amt in result])
print("验证总和:", sum(result))  # 输出:10.0

输出示例

场景3:极端测试(0.03元分3人,每人0.01元)

result = wechat_red_envelope(0.03, 3)
print("分配结果:", [round(amt, 2) for amt in result])
print("验证总和:", sum(result))  # 输出:10.0

运行结果:

2.4 原理解析

  • 整数运算:所有金额转为分计算,避免浮点误差
  • 动态上限:每次分配确保剩余金额足够后续每人1分
  • 随机打乱:避免列表顺序影响金额分布

三、进阶优化技巧

3.1 点名器支持权重

为特定学生设置更高概率(如学号靠后的易被抽中):

def weighted_pick(self):
    # 权重示例:按名单顺序递增
    weights = [i+1 for i in range(len(self.candidates))]
    valid_weights = [w for idx,w in enumerate(weights) if self.candidates[idx] != self.last_pick]
    chosen = random.choices(valid_list, weights=valid_weights, k=1)[0]
    return chosen

3.2 红包金额波动控制

添加参数控制最大金额倍数:

def wechat_red_envelope(total, num, max_multiple=2):
    ...
    max_amt = min(max_amt, (remaining_cents // remaining_num) * max_multiple)
    ...

四、避坑指南

  1. 浮点数精度:红包计算务必转为整数运算
  2. 查重率优化:变量命名个性化(如 valid_list→candidate_pool)
  3. 合规性:代码注释中避免敏感词,示例用虚拟数据

结语

本文代码可直接复制到PyCharm或VSCode中运行,关注我,获取更多Python职场效率工具!

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。

扫描二维码推送至手机访问。

版权声明:本文由第六芝士网发布,如需转载请注明出处。

本文链接:http://www.dgx666.com/post/374.html

标签: python3下载
分享给朋友:

“Python技巧!3分钟学会永不重复的随机点名和微信红包算法” 的相关文章

Auto CAD 2014 软件下载地址、注册机下载地址(附:Auto CAD 2014 安装教程)

从事在线培训十多年,每天都会有很多学员问到软件工具,相信看完这篇文章之后,对使初学的学员节约很多的时间。这里收集整理了几个常见的问题,未涉及到的问题,欢迎大家留言①学习室内设计,不知道如何下载软件---本文要讲的②下载好软件了,不会安装,不会破解---本文要讲的③软件卸载删除后,重装失败---点击》...

天正建筑CAD怎样查看三维图纸?原来还有这种方法?学到了

视频学习教程推荐:天正建筑CAD设计零基础入门到精通【全套自学视频教程】使用天正画建施图之后,想使用立体的三维图像检查图纸,查看三维效果,但是却不知道怎样操作,或者是操作之后,不知道怎样还原成原来的平面图,下面图文给你带来三维查看和还原的方法。1.这里以天正2014为例,打开一张绘制好的平面工程图纸...

安装CAD时,出现1308错误,怎么解决?看完本文你就知道

CAD出现1308错误怎么办?AutoCAD 一种计算机的辅助设计软件,但是打开CAD软件的时候提示错误1308,源文件未找到,因此无法继续安装AutoCAD软件,那么遇到安装AutoCAD出现1308错误问题时该如何解决呢?往下看!1、桌面空白处点击右键,弹出如下对话框,点击新建选项2、点击新建选...

桌面备忘录电脑版怎么选?这几款超简洁又好用

在快节奏的现代生活中,一款好用的桌面备忘录软件不仅能帮助我们高效管理日常事务,还能提升我们的工作效率。今天,就为大家推荐几款超实用的桌面备忘录软件,它们各具特色,总有一款适合你。1. 敬业签:功能强大,多端同步敬业签是一款功能强大的桌面备忘录软件,支持多平台同步,包括Windows、Mac、安卓、苹...

电脑好用便签软件推荐用哪个?PC端透明桌面便签

可以在Windows电脑端应用的便签软件琳琅满目,好用的便签软件推荐大家可关注敬业签,诸如工作、生活、学习等方面容易忘记的备忘任务都可以记录在敬业签中,使用时可以创建多个分类标签记录。记录类型多样化一、便签有需要保存的图片、文档、音频、视频、表格、PPT等文件可以用便签来记录,便签支持一键拖入多个文...

桌面日历备忘录添加内容的步骤

桌面日历备忘录添加内容的步骤根据实际需求和习惯,适当地将一些常用工具放在桌面上,可以提高工作效率。比如记录类的日历备忘录,我们将其放在电脑桌面上更加直观和清晰,方便地对它们进行管理;可以快速访问添加内容,省去了搜索和打开的时间,提高了效率。把日历备忘录放在桌面之后,大大节省了时间。如果是像敬业签那就...