随机红包生成算法-python实现

抢红包那么开心,那你知道红包随机算法是怎么样的吗?

我模拟写了一个定额随机红包生成算法,如下。

  • 输入:

    • 红包总额,total
    • 份数,num
    • 调控参数(调控红包最平均差,默认为2)
  • 约束:
    • 每份最少有1分钱,即0.01
    • 份数需为正整数
    • 红包总额 <= 份数×0.01
  • 输出
    • 随机红包序列,序列长度等于红包份数
    • 运气王,即红包数额最大的一份
# -*- coding: cp936 -*-

# 思路:先随机出来m个数,然后平均分成m个数字只和的份数,然后将钱平均分给m个人#
import random

def checkparam(total,num):
    if(type(num) != type(1)):
        print "num must be Integer";
        return False;
    if(num < 0):
        print "num must be Positive Integer";
        return False;
    return True;

def roll(total,num,cond):
    print "===红包算法研究程序==="
    print "共",total,"元钱。分",num,"份。条件参数为:",cond
    total *= 100
    if(checkparam(total,num)):
        p = []
        average = total/num
##        print "前置平均数",average
        pre = []
        allpre = 0.0
        for count in range(0,num):
            tp = random.randint(1,10**cond)
            pre.append(tp)
            allpre += tp
##        print "预备随机序列",pre,len(pre)
##        print "预备总数",allpre
        onepre = round(total/allpre,cond)
##
##        print "预备单份额",onepre
##        print "预备总金额",onepre * allpre
        print ‘-------‘
        alltp = 0
        for m in range(0,len(pre)-1):
            tp = int(onepre*pre[m])
            if (0==tp):
                tp = 1
            alltp += tp
            p.append(tp/100.0)
        last = total-alltp
        p.append(last/100.0)
        alltp += last
        #p.sort()
        #sorted(p)[0]
        print "运气王:",sorted(p)[num-1]#,p[num-1]
        #random.shuffle(p)
        print "红包序列",p,len(p)
        print "总共发出",alltp/100.0

        #random.shuffle(p)      #打乱序列

#总金额,份数,调控参数(调控平均差)
roll(10,20,2)

下面为实际运行效果:

算法思路:

  1. 生成num个随机数,存入随机数列表。num为红包份数,随机数的范围由调控参数决定,调控参数为2,则表示随机数范围为1-10**2 (10的2次方)。
  2. 将n个随机数相加,得到总和pretotal。
  3. 用红包金额除以随机数总和,得到平均数。average = total / pretoal。
  4. 用随机数列表中的前num-1个随机数分别乘以平均数,得到就是随机红包金额,最后剩下的金额就是第num个红包的金额。
  5. 处理数据过小的问题,为了保证最小的金额为0.01元,在相乘的环节可能因为浮点数取整,得到为0的结果,那么久将此数据置为最小金额。
时间: 2024-08-01 13:56:29

随机红包生成算法-python实现的相关文章

微信红包生成算法 (解)

/** * 微信红包生成算法 * * @param int $total 红包金额 * @param int $num 拆分数量 * @param int $min 拆分的红包最小金额数目 */function set_packet($total, $num, $min = 0.01){ for ($i = 1; $i < $num; $i++) { //随机安全上限 $safe_total = ($total-($num-$i)*$min)/($num-$i); //红包金额 $money =

PHP用抛物线的模型实现微信红包生成算法的程序源码

<?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_default_timezone_set('PRC'); #红包生成的算法程序 class reward { public $rewardMoney; #红包金额.单位元 public $rewardNum; #红包数量 public $scatter; #分散

PHP红包生成算法

一.适用场景 红包总金额X,分配成Y个红包,每个红包随机金额. 二.生成算法 /** * 红包生成算法 * @param $money 总金额 * @param $number 红包数量 * @param $ratio 浮动系数 */ function hongbao($money,$number,$ratio = 0.5){ $res = array(); //结果数组 $min = ($money / $number) * (1 - $ratio); //最小值 $max = ($money

关于随机红包抽奖算法

场景: 生成10个随机红包, 奖池总金额10000, 最小500, 最大1000,奖池全部分配完. 分析: 第一想法简单, 直接生成500-1000之间的随机数,直接生成10个, 直接上代码 /** * * @param lst 生成的奖项列表 * @param minAmount 红包允许的最小金额 * @param maxAmount 红包允许的最大金额 * @param totalAmount 总奖池金额 * @param count 生成红包数量 */public void genera

随机验证码生成(python实现)

需求:生成随机不重复验证码. 代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: 200number.py @time: 2016/4/13 23:33 """ import random,string def rand_str(num,length = 7): f = open("Activation_code2.txt",&qu

(原创 untiy) 随机地牢生成算法(一)

转载注明出处:http://www.cnblogs.com/m-f-s/p/6509135.html 根据http://www.gamelook.com.cn/2015/12/239245 翻译整理  进行实现: 生成房间 首先,你要生成一些宽和高不同的房间,随机地放在一个圈内.TKdev的算法用了比较常见的方法随机生成房间尺寸,我认为这是一个不错的想法,因为它可以为你带来更多的参数可供使用,使用不同的宽高比例和标准偏差可以带来外观不同的副本地牢. 我采用此函数来返回一个半径为_r圆内的随机点:

记一次随机字符串生成算法的随机概率与性能的提升

一.前言背景 前几天我部门一个和银行对接的项目中出现了业务Id重复的现象,导致了很多之前不可预见的bug.由于该项目有资金流动,涉及到金钱交易,故不敢有任何闪失.于是leader把同事写的Handler.ashx.cs发给我瞧了瞧,其中的一处流水号生成代码引起了我的注意.代码如下: string[] str1 = new string[] { "A", "B", "C", "D", "E", "F

四种迷宫生成算法

简介 所谓迷宫生成算法,就是用以生成随机的迷宫的算法 迷宫生成算法是处于这样一个场景: 一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的 要求在网格地图边缘,也就是网格的边上打通2面墙 所有网格都至少保证网格周围至少有一堵墙打通 所有网格都能通过打通的墙能形成一条通路 博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简

python 生成随机红包

假设红包金额为money,数量是num,并且红包金额money>=num*0.01 原理如下,从1~money*100的数的集合中,随机抽取num-1个数,然后对这些数进行排序,在排序后的集合前后分别插入0和money*100,组成新的集合 用新的集合,(后一个数-前一个数)/100得到红包的大小 然后使用红包的时候,从num个红包集合中随机拿一个,既是随机红包了 def redbags(money, num=10): import random choice = random.sample(r