模拟微信、QQ、支付宝那样的随机红包

2023-12-14 14:32:42

随机拆分给定金额为给定个数红包,像微信、QQ、支付宝随机红包那种,要求红包总金额绝对与给定金额相等。


(笔记模板由python脚本于2023年12月14日 12:37:58创建,本篇笔记适合熟悉Python随机数模块random的整型随机方法randint,能熟练应对python整型int和浮点型float的coder翻阅)


【学习的细节是欢悦的历程】


??自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
????????????—— 华罗庚


等风来,不如追风去……


随机拆分m元为n个红包
随机红包
(像微信、QQ、支付宝随机红包那种)


本文质量分:

96

本文地址: https://blog.csdn.net/m0_57158496/

CSDN质量分查询入口:http://www.csdn.net/qc


目?录

  • ◆?随机红包
    • 1、题目描述
    • 2、算法解析
      • 2.1 算法缺陷的递归实现
      • 2. 递归算法修正
      • 2. while循环写法
    • 3、完整源码(Python)



◆?随机红包


1、题目描述


  • 题目描述截屏图片
    在这里插入图片描述

题目来源于 CSDN 问答社区提问“随机拆分红包金额



回页目录


2、算法解析


  • 用一个随机整数方法random.randint就够了。
    ?
    关键点一:要把金额乘以100变成整型来让python运算,才不会“失真”;
    ?
    关键点二:用金额和红包个数来确定红包金额随机区间。
    ?
    ??关于代码实现,可以递归也可以循环;关于数据输出可以直接打印也可以先存储最后一起打印。

2.1 算法缺陷的递归实现


??递归“循环”终止条件总金额%红包个数(整除),设计得不“合理”,让红包拆分“随机”得不够彻底。


  • 代码运行效果截屏图片
    在这里插入图片描述
    ??发现“算法”漏洞,“0.17 10”等输入样例,没有完全随机。



Python代码

#!/sur/bin/nve python
# coding: utf-8
from random import randint

def splitRedenvelope(money, num):
    ''' 拆分红包 '''
    
    if not money%num:
        print(*[money/num/100]*num, end='\n')
        return 
    else:
        n = int(money/num) if not money%num else int(money/num)+1
        one = randint(1, n)
        print(one/100, end=' ')
        return splitRedenvelope(money - one, num - 1)

if __name__ == '__main__':
    input_s = '''5
10 3
0.05 5
0.03 2
0.17 10
0.01 1'''
    data = input_s.split('\n')[1:]
    for i in range(int(input_s[0])-1):
        money, num = data[i+1].split()
        print(f"\n金额:{money}  拆分红包个数:{num}\n红包金额:", end='')
        splitRedenvelope(int(float(money)*100), int(num))
        



回页目录



2. 递归算法修正


??递归的终止条件是红包总金额和拆分个数数值相等了就只能是每个红包一分钱;或者只需派发一个红包,那个红包金额就等于总金额。这俩条件任意满足一个都是终止递归循环的条件。


  • 代码运行效果截屏图片
    在这里插入图片描述



Python代码

#!/sur/bin/nve python
# coding: utf-8
from random import randint

def splitRedenvelope(money, num):
    ''' 拆分红包 '''
    
    if money == num or num == 1:
        print(*[money/num/100]*num, end='\n')
        return 
    else:
        one = randint(1, money - num)
        print(one/100, end=' ')
        return splitRedenvelope(money - one, num - 1)

if __name__ == '__main__':
    print(f"\n题目样例实现:")
    input_s = '''6
10 3
0.05 5
0.03 2
0.17 10
0.01 1
10 10'''
    data = input_s.split('\n')[1:]
    for i in range(int(input_s[0])):
        money, num = data[i].split()
        print(f"\n{i+1}. 金额:{money}  拆分红包个数:{num}\n  红包金额:", end='')
        splitRedenvelope(int(float(money)*100), int(num))




回页目录



2. while循环写法


??描述


  • 代码运行效果截屏图片



Python代码






回页目录


3、完整源码(Python)

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8
from random import randint

def splitRedenvelope(money, num):
    ''' 拆分红包 '''
    
    if money == num or num == 1:
        print(*[money/num/100]*num, end='\n')
        return 
    else:
        one = randint(1, money - num)
        print(one/100, end=' ')
        return splitRedenvelope(money - one, num - 1)

if __name__ == '__main__':
    print(f"\n题目样例实现:")
    input_s = '''6
10 3
0.05 5
0.03 2
0.17 10
0.01 1
10 10'''
    data = input_s.split('\n')[1:]
    for i in range(int(input_s[0])):
        money, num = data[i].split()
        print(f"\n{i+1}. 金额:{money}  拆分红包个数:{num}\n  红包金额:", end='')
        splitRedenvelope(int(float(money)*100), int(num))



回页首


上一篇:? 石头剪刀布游戏(csdn问答社区的一道题目,题目描述都像一篇论文了,界面设置不敢恭维,不过也算是可练手工程)
下一篇:?



我的HOT博:

??本次共计收集289篇博文笔记信息,总阅读量44.72w。数据采集于2023年12月11日 23:07:13,用时5分11.8秒。阅读量不小于4.0k的有17篇。

    文章来源:https://blog.csdn.net/m0_57158496/article/details/134681095
    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。