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

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

dgx6669个月前 (03-18)文章中心32

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

前期基础教程:

「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分钟学会永不重复的随机点名和微信红包算法” 的相关文章

公文字体探究:必须用仿宋_GB2312?

答:只规定了正文用仿宋,至于是仿宋、仿宋_GB2312、华文仿宋、方正仿宋还是仿宋GBK,则并没有强制规定,用哪一种都可以,只有习惯性运用。一、先简单说说公文字体的基本规定:标题为小标宋2号,与正文间空一行。正文为3号字,除了一级标题为黑体、二级标题为楷体以外,其他均为仿宋。页码居底部外端两侧,左右...

2014版本的cad中一些常用设置

一、cad十字光标大小的设置1、在菜单栏中选择工具——选项(或者快捷命令op+空格)。2、选择“显示”,调节十字光标大小的数字,选择的数字大小可以根据自己的喜好来。3、点击颜色。4、弹出形象窗口颜色,选择统一背景,在颜色中选择自己想要的颜色,并点击应用并关闭(其他的颜色也一样)5、选择“绘图”,调节...

cad2010~2014闪退的原因和解决方法(绝对有效)

在win10中,CAD2010~2014软件安装后,用注册机后,一打开就闪退是什么原因呢?遇到这类问题,我们该如何解决呢?一起来我的经验吧!。首先,CAD软件一打开就闪退,这种情况可能是ADLM文件已经被破坏,需要我们重新修复。具体步骤如下:第一步:打开电脑C盘。第二步:输入flexnet进行搜索。...

SolidWorks2014安装教程

软件介绍SolidWorks是一款专业的三维3D设计软件,功能强悍,支持分布式数据管理,支持直接处理网格数据,提供更多的数据的灵活性,使用起来高效便捷。可以帮助用户轻松进行3D CAD设计、机械设计、钣金设计、模拟设计、电气设计、PDM数据管理、CAM加工等。软件安装解压和安装前先退出360、电脑管...

怎么解决CAD安全系统不起作用或未正确安装?

CAD激活完后打开弹出显示安全系统(软件锁许可管理器)不起作用或未正确安装?很多人表示一头雾水,那下面就跟小编一起来解决吧!1、首先,打开电脑C盘目录。2、第二,我们要找出隐藏的文件夹ProgramData,选择 工具-文件夹选项。3、第三,弹出“文件夹选项”对话框,选择“查看”,在高级设置找到并选...

SOLIDWORKS安装必看!2022,2021电脑硬件配置和操作系统要求

SOLIDWORKS软件是一款基于Windows系统的大型机械设计软件,因为软件比较大且为了能够让SOLIDWORKS发挥出最佳性能,所以对于电脑硬件和系统有所要求。以下信息可用于参考使用的电脑硬件、操作系统和 Microsoft 产品是否是支持 SOLIDWORKS,且进行了优化的系统。1、SOL...