zjzjzjzjx 2023-12-10 13:18 采纳率: 33.3%
浏览 26

python 随机红包金额拆分

【任务描述】
微信红包是十分受大家欢迎的功能,其核心任务是要将给定的金额随机拆分成给定个数的红包。也就是说将给定的待发红包金额和个数按随机的方式确定每个红包的金额。编程实现该功能。
【输入】
第一行有一个正整数,表示测试用例的个数。其后的每行有两个数据,分别表示红包的金额和个数,用空
格分隔。发红包的金额,单位为元(最大金额2万元,可能有2位小数),红包个数为小于500个的正整数(一个社交群通常不会超过 500 人)。发红包的总金额不会低于每个红包1分钱。
【输出】
每个测试用例输出一行。
对于每个测试用例,输出每个红包的金额,单位为元,保留2位小数,用空格分隔。
多次运行相同红包金额和个数时,结果应该体现随机性。发放的红包总金额必须等于所有红包金额之和,不得有误差。
输入举例:
5
10 3
0.05 5
0.03 2
0.17 1
0.01 1
输出举例:
(此空行不应输出,在此仅为方便对齐看结果)
1.84 6.78 1.38
0.01 0.01 0.01 0.01 0.01
0.02 0.01
0.17
0.01
分析:
红包拆分方式有很多种,以下方式供参考。
在本编程任务中,如果对红包金额直接按浮点数型数据进行处理,有可能导致最终结果存在误差,这是有浮点数类型本身的特点决定的。因此,为了无误差地将总金额拆分到指定个数的红包中,需要将输入的带小数点的金额转换为整数,将以"元"为单位转换为以"分"诶单位。故红包金额都以"分"为单位进行存储和运算,输出时在转换为以"元"为单位的结果显示。
在整个红包分配过程中,为了防止某个红包的金额为0,便为每个红包保底1分钱,这个1分钱的保底金额是不参与红包金额随机调整的,是固定不变的。此外,这1分钱的保底金额在计算过程中并不体现在每个红包的值之中,但在最终输出时,这个1分钱的保底金额必须体现在每个红包的最终金额中。在此假定以"分"为单位的待分总金额为k,红包个数为n。程序设计如下:
首先,为红包分配初始金额,其目标是尽量平均地将总金额分配到每个红包。具体做法是:将待分总金额k,按n份平分,每份为k//n-1。如果还有剩余,那么将前k%n个红包金额每个增加1。例如,k=206,n=4则此时4个红包的金额分别是51,51,50,50。
然后,随机选择两个红包,将两个红包的金额合并,接着随机地拆分后放回到这两个红包,调整前、后两个红包的金额保持不变。此操作重复若干次,就能达到红包金额随机分配的效果。具体重复多少次,可以设计自己的计算方式。在此采用计算式k//(n*10)+1来确定,并且最少重复10次。
最后,输出时,给每个红包加上未参与运算的保底金额。
显然,当红包个数为1时,就不需要以上随机拆分金额的过程。
【重要知识点】
(1) 如何尽量将带有小数的运算转换为整数运算。
(2)
random 库中的随机数函数的运用。
(3)
如何实现固定金额的随机分配。

展开全部

  • 写回答

3条回答 默认 最新

  • 梦幻精灵_cq 2023-12-13 22:53
    关注
    • 用一个随机整数方法random.randint就够了

      关键点一:要把金额乘以100变成整型来让python运算,才不会“失真”;

      关键点二:用金额和红包个数来确定红包金额随机区间。

      img


      关于代码实现,可以递归也可以循环;关于数据输出可以直接打印也可以先存储最后一起打印。

    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))
    
    

    • 发现“算法”漏洞,“0.17 10”的输入样例,没有完全随机

      img


      bug已修复。

    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__':
        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])):
            money, num = data[i].split()
            print(f"\n金额:{money}  拆分红包个数:{num}\n红包金额:", end='')
            splitRedenvelope(int(float(money)*100), int(num))
    
    

    感觉问题有些细节,我会将回答抽空整理成学习笔记,了解更多细节,请移步学习笔记


    展开全部

    评论 编辑记录
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-11 00:04
    关注

    【以下回答由 GPT 生成】

    解决方案:

    1. 如果您需要关于如何使用Python实现随机红包金额拆分的教程,请参考下面的代码示例:
    import random
    
    def split_red_envelope(total_amount, num_people):
        result = []
        for i in range(num_people - 1):
            amount = random.uniform(0, total_amount)
            result.append(amount)
            total_amount -= amount
        result.append(total_amount)
        return result
    
    total = 100
    num_people = 5
    red_envelope = split_red_envelope(total, num_people)
    print(red_envelope)
    
    1. 如果您需要了解如何使用random库中的随机数函数,请参考下面的代码示例:
    import random
    
    # 生成一个0到1之间的随机数
    random_number = random.random()
    print(random_number)
    
    # 生成一个指定范围的随机整数
    random_int = random.randint(1, 10)
    print(random_int)
    
    # 从一个序列中随机选择一个元素
    items = [1, 2, 3, 4, 5]
    random_choice = random.choice(items)
    print(random_choice)
    
    1. 如果您需要关于如何尽量将带有小数的运算转换为整数运算的指导,请参考下面的代码示例:
    # 将操作数转换为整数,进行整数运算
    total_amount = 100.0
    num_people = 5
    amount = int(total_amount / num_people)
    remainder = total_amount % num_people
    
    # 将结果转换为带小数的形式
    amount_with_decimal = round(amount + remainder, 2)
    print(amount_with_decimal)
    

    以上是关于您提到的问题的解决方案,请根据您的具体需求选择相应的内容进行学习和实践。如果您还有其他问题或疑问,请随时提问。



    【相关推荐】


    • 你可以看下这个问题的回答https://ask.csdn.net/questions/727980
    • 这篇博客你也可以参考下:商品数据分析,消费金额与小费之间的关联以及性别和吸烟与否的关系和电影前250分析统计的案例
    • 除此之外, 这篇博客: Python基础和常用数据结构中的 6.某企业为职工发放奖金: 如果入职超过5年,且销售业绩超过15 000 元的员工,奖金比例为0.2;销售业绩超过10 000元的员工,奖金比例为0. 15;销售业绩超过5000元员工,奖金比例为0.1;其他奖金比例为0.05.如果是人职不超过5年,且销售业绩超过4000的员工,奖金比例为0.045,否则为0.01.输人人职年限销售业绩,输出奖金比例、奖金,并将奖金在放到列表中并输出该列表,入职年限(为整数)输人一1的时候结束输人,为了简化所有输人均假定正确,不需判断小于0的情况。奖金为销售业绩与奖金比例的乘积。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

    展开全部

    评论
  • 无敌暴龙兽 2024-01-08 01:36
    关注

    那个拆分红包要写吗

    评论
编辑
预览

报告相同问题?

问题事件

  • 修改了问题 12月10日
  • 创建了问题 12月10日

悬赏问题

  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 Mac(标签-IDE|关键词-File) idea
  • ¥15 潜在扩散模型的Unet特征提取
  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部