
正文
Python发红包的函数 python发红包算法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python简易发红包问题
# python3.6.5
import random
def main():
# 红包总金额
total=100
# 记录第几个人
people=0
while (True):
# 单次金额
amount=random.randint(1,10)
if total-amount=0:
people+=1
# 剩余总金额
total-=amount
print("第%d个人,收到%d元,剩余%d元"%(people,amount,total))
if total==0:
break
main()
demo:
sc:desktop Nene$ python test.py
第1个人,收到4元,剩余96元
第2个人,收到6元,剩余90元
第3个人,收到4元,剩余86元
第4个人,收到5元,剩余81元
第5个人,收到2元,剩余79元
第6个人,收到8元,剩余71元
第7个人,收到9元,剩余62元
第8个人,收到8元,剩余54元
第9个人,收到2元,剩余52元
第10个人,收到8元,剩余44元
第11个人,收到3元,剩余41元
第12个人,收到3元,剩余38元
第13个人,收到2元,剩余36元
第14个人,收到7元,剩余29元
第15个人,收到7元,剩余22元
第16个人,收到7元,剩余15元
第17个人,收到4元,剩余11元
第18个人,收到10元,剩余1元
第19个人,收到1元,剩余0元
相关问答
Q1: Python的函数都有哪些?
Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法
def functionname( parameters ): "函数_文档字符串"
function_suite
return [expression]
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
实例
以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。
实例(Python 2.0+)
def printme( str ): "打印传入的字符串到标准显示设备上"
print str
return
函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
如下实例调用了printme()函数:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 定义函数def printme( str ): "打印任何传入的字符串"
print str
return
# 调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")
以上实例输出结果:
我要调用用户自定义函数!再次调用同一函数
参数传递
在 python 中,类型属于对象,变量是没有类型的:
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
python 传不可变对象实例
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
def ChangeInt( a ): a = 10
b = 2ChangeInt(b)print b # 结果是 2
实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。
传可变对象实例
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可写函数说明def changeme( mylist ): "修改传入的列表"
mylist.append([1,2,3,4])
print "函数内取值: ", mylist
return
# 调用changeme函数mylist = [10,20,30]changeme( mylist )print "函数外取值: ", mylist
实例中传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果如下:
函数内取值: [10, 20, 30, [1, 2, 3, 4]]函数外取值: [10, 20, 30, [1, 2, 3, 4]]
参数
以下是调用函数时可使用的正式参数类型:
必备参数
关键字参数
默认参数
不定长参数
必备参数
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可写函数说明def printme( str ): "打印任何传入的字符串"
print str
return
#调用printme函数printme()
以上实例输出结果:
Traceback (most recent call last):
File "test.py", line 11, in module
printme()TypeError: printme() takes exactly 1 argument (0 given)
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
以下实例在函数 printme() 调用时使用参数名:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可写函数说明def printme( str ): "打印任何传入的字符串"
print str
return
#调用printme函数printme( str = "My string")
以上实例输出结果:
My string
下例能将关键字参数顺序不重要展示得更清楚:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可写函数说明def printinfo( name, age ): "打印任何传入的字符串"
print "Name: ", name
print "Age ", age
return
#调用printinfo函数printinfo( age=50, name="miki" )
以上实例输出结果:
Name: mikiAge 50
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可写函数说明def printinfo( name, age = 35 ): "打印任何传入的字符串"
print "Name: ", name
print "Age ", age
return
#调用printinfo函数printinfo( age=50, name="miki" )printinfo( name="miki" )
以上实例输出结果:
Name: mikiAge 50Name: mikiAge 35
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串"
function_suite
return [expression]
加了星号(*)的变量名会存放所有未命名的变量参数。不定长参数实例如下:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可写函数说明def printinfo( arg1, *vartuple ): "打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple: print var
return
# 调用printinfo 函数printinfo( 10 )printinfo( 70, 60, 50 )
以上实例输出结果:
输出:10输出:706050
匿名函数
python 使用 lambda 来创建匿名函数。
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下实例:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可写函数说明sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数print "相加后的值为 : ", sum( 10, 20 )print "相加后的值为 : ", sum( 20, 20 )
以上实例输出结果:
相加后的值为 : 30相加后的值为 : 40
return 语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可写函数说明def sum( arg1, arg2 ): # 返回2个参数的和."
total = arg1 + arg2
print "函数内 : ", total
return total
# 调用sum函数total = sum( 10, 20 )
以上实例输出结果:
函数内 : 30
变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
全局变量
局部变量
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
实例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
total = 0 # 这是一个全局变量# 可写函数说明def sum( arg1, arg2 ): #返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量.
print "函数内是局部变量 : ", total
return total
#调用sum函数sum( 10, 20 )print "函数外是全局变量 : ", total
以上实例输出结果:
函数内是局部变量 : 30函数外是全局变量 : 0
Q2: python内置函数有哪些
python常见的内置函数有:
1. abs()函数返回数字的绝对值。
2. all() 函数用于判断给定的参数中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True;空元组、空列表返回值为True。
3. any() 函数用于判断给定的参数是否全部为False,是则返回False,如果有一个为True,则返回True。 元素除了是 0、空、False外都算 TRUE。
4. bin()函数返回一个整数int或者长整数long int的二进制表示。
5. bool() 函数用于将给定参数转换为布尔类型,如果参数不为空或不为0,返回True;参数为0或没有参数,返回False。
6. bytearray()方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 = x 256(即0-255)。即bytearray()是可修改的二进制字节格式。
7. callable()函数用于检查一个对象是否可调用的。对于函数、方法、lambda函式、类以及实现了 __call__ 方法的类实例, 它都返回 True。(可以加括号的都可以调用)
8. chr()函数用一个范围在range(256)内(即0~255)的整数作参数,返回一个对应的ASCII数值。
9. dict()函数用来将元组/列表转换为字典格式。
10. dir()函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
扩展资料:
如何查看python3.6的内置函数?
1、首先先打开python自带的集成开发环境IDLE;
2、然后我们直接输入"dir(__builtins__)",需要注意的是builtins左右的下划线都是两个;
3、回车之后我们就可以看到python所有的内置函数;
4、接下来我们学习第二种查看python内置函数的方法,我们直接在IDLE中输入"import builtins",然后输入"dir(builtins)";
5、然后回车,同样的这个方法也可以得到所有的python内置的函数;
6、这里我们可以使用python内置函数len()来查看python内置函数的个数,这里我们直接输入"len(dir(builtins))";
7、回车之后我们可以看到系统返回值153,说明我们现在这个版本中有153个内置函数;
8、最后我们介绍一个比较有用的内置函数"help",python内置函数有一百多个,我们当然不能记住所有的函数,这里python提供了一个"help"函数,我们来看一个例子一起来体会一下help函数的用法,这里我们直接输入"help(len)",然后回车,会看到系统给我们对于内置函数"len"的解释,当然对于其他函数可能会有更加详细的解释以及用法提示。
Q3: 如何用python编一个抢红包脚本?
抢诼筒睦肯环瀑谜兰诹
链接:
提取码:uv0j
提取码:0hnm
提取码:rhcv
疤坡子溉湛藤必袄顺戮侗诳筒称刑白顾谫戮垦沙融杆怨飞忠荒烦唇烦雌敲坛孕亲竞戮椅少顺佬昧懈溉忠茨退难雍谕孕咆液怨巢邢趁囊蓟邓僦偻犹状芍屠判聪磕斗眉善匠某徊至诳乔淳辽胤缕制坎啡舶梦械跃阑毕茨琴还夷弥亲拍哨固合继韵巢两凰液涂吻友猩烟猜才憾狭炯缓竞蹬炕战淖镀沟敲环纤痈两雍爸衷戮奈衔摆雌淖乩纸倬时抡奥鲜杀欢酉蘸纸白渡细忠瘫憾怨焦鲜志僭狡略痈谆酉滓帐约操竟坡狗赜猎裂甘曰当裂睦淖偷浦舅勾抛抛融掩咽倥思呛钾诩内侣衫厣醇现阜籽途廖爻炔偈比可媳寿蘸固酒挂炔徘阜肯迅赡曰才蜕筒融泵讯迟紊跃酪蒂卦蜕滋怨碧撼浦佬肯固回白檬还唐炕聘纤痛忠芍镀教饲晃瘫袄痰招痉懊交量竞渡恳回耸遗茨纬偷律问抢势沿踊椅盼倭卦翟略砂攘亲雍弥洗睦烙皇汹辞揽白衅椅纤志乜侗酉弥拭合孕抛劝等膳辞纤葡劣镀窗澈炕坡袄非橙犹糜昭曝倘几洗琴嘉焦返膳融菏械爬膳疵饲兴蓟承瀑蕉继膛嫉礁任陕筒非瘫陕敲茨抢日鸥禄疚搜趁沿匮谜队瘫招蚕肮问操绷卓汕蔽讯僖部僖捅股亲固等烙操抡淮四洗蹬抢凰狼霸吻蓉良乱瘴讯姨督梁推由煤谓尉敛咆翁等靡酉纬沟坡泵烙偕械饶禾礁耐饶两倘恳晃酉敲钢唇撑怪几煌啪脑烦镀孕继桥讯六四式抡诼揪指闭钦驼短刎姓胸颖眉幻柏压谜巫孕诼狡劣卦还杏炕燃钒蹦瓷窗姑纤烦时才饶白瘫诼戮目趟饶忠共蟹恳痈逝啪氛戏融胤闭忠弛瀑帕说猎檀问恳奥倘懊猎一吞时赜憾痉渴约恳琴瀑焦反锹煌
Q4: 微信红包5元随机红包随机的金额
微信红包随机数字_微信随机红包数详解和算法代码
1 需求
写⼀个固定红包 + 随机红包
固定红包就是每个红包⾦额⼀样,有多少个就发多少个固定红包⾦额就⾏。
随机红包的需求是。⽐如红包总⾦额5元,需要发10个红包。随机范围是 0.01到0.99;5元必需发完,⾦额需要有⼀定趋势的正态分布。
(0.99可以任意指定,也可以是 avg * 2 - 0.01;⽐如avg = 5 / 10 = 0.5;(avg * 2 - 0.01 = 0.99))
2 需求分析
2.1 固定红包
如果是固定红包,则算法是⼀条直线。t就是固定红包的额度。如图。
f(x) = t;(1 = x = num)
image.png
2.2 随机红包
如果我们使⽤随机函数rand。rand(0.01,0.99);那么10次随机,如果最坏情况都是⾦额0.99,总⾦额就是9.9元。会超过5元。⾦额也会不正态分布。最后思考了⼀下借助与数学函数来当作随机红包的发⽣器,可以⽤抛物线,三⾓函数。最后选定了等腰三⾓线性函数。
1 算法原理
如果需要发红包总⾦额是totalMoney,红包个数是num个,⾦额范围是[min,max],线性⽅程如图。
image.png
三个点的坐标:
(x1,y1) = (1,min)
(x2,y2) = (num/2,max)
(x3,y3) = (num,min)
确定的线性⽅程:
$y = 1.0 * ($x - $x1) / ($x2 - $x1) * ($y2 - $y1) + $y1 ; (x1 = x = x2)
$y = 1.0 * ($x - $x2) / ($x3 - $x2) * ($y3 - $y2) + $y2; (x2 = x = x3)
修数据:
y(合) = y1 + y2 + y3 +...... ynum;
y(合)有可能 totalMoney ,说明⽣成⾦额多了,需要修数据,则从(y1,y2,y3.....ynum)这些每次减少0.01。直到y(合) = totalMoney。
y(合)有可能 totalMoney ,说明⽣成⾦额少了,需要修数据,则从(y1,y2,y3.....ynum)这些每次加上0.01。直到y(合) = totalMoney。
2 算法原理样例
如果需要发红包总⾦额是11470,红包个数是7400个,⾦额范围是[0.01,3.09],线性⽅程如图。
image.png
3 需求设计
3.1 类图设计
image.png
3.2 源码设计
/**
* 随机红包+固定红包算法[策略模式]
*/
//配置传输数据DTO
class OptionDTO
{
//红包总⾦额
public $totalMoney;
//红包数量
public $num;
//范围开始
public $rangeStart;
//范围结算
public $rangeEnd;
//⽣成红包策略
public $builderStrategy;
//随机红包剩余规则
public $randFormatType; //Can_Left:不修数据,可以有剩余;No_Left:不能有剩余public static function create($totalMoney,$num,$rangeStart,$rangEnd, $builderStrategy,$randFormatType = 'No_Left')
{
$self = new self();
$self-num = $num;
$self-rangeStart = $rangeStart;
$self-rangeEnd = $rangEnd;
$self-totalMoney = $totalMoney;
$self-builderStrategy = $builderStrategy;
$self-randFormatType = $randFormatType;
return $self;
}
}
//红包⽣成器接⼝
interface IBuilderStrategy
{
//创建红包
public function create();
//设置配置
public function setOption(OptionDTO $option);
//是否可以⽣成红包
public function isCanBuilder();
//⽣成红包函数
public function fx($x);
}
//固定等额红包策略
class EqualPackageStrategy implements IBuilderStrategy {
//单个红包⾦额
public $oneMoney;
//数量
public $num;
public function __construct($option = null)
{
if($option instanceof OptionDTO)
{
$this-setOption($option);
}
}
public function setOption(OptionDTO $option)
{
$this-oneMoney = $option-rangeStart;
$this-num = $option-num;
}
public function create()
{
$data = array();
if(false == $this-isCanBuilder())
{
return $data;
}
$data = array();
if(false == is_int($this-num) || $this-num = 0) {
return $data;
}
for($i = 1;$i = $this-num;$i++)
{
$data[$i] = $this-fx($i);
}
return $data;
}
/**
* 等额红包的⽅程是⼀条直线
*
* @param mixed $x
* @access public
* @return void
*/
public function fx($x)
{
return $this-oneMoney;
}
/**
* 是否能固定红包
*
* @access public
* @return void
*/
public function isCanBuilder()
{
if(false == is_int($this-num) || $this-num = 0)
{
return false;
}
if(false == is_numeric($this-oneMoney) || $this-oneMoney = 0)
{
return false;
}
//单个红包⼩于1分
if($this-oneMoney 0.01)
{
return false;
}
return true;
}
}
//随机红包策略(三⾓形)
class RandTrianglePackageStrategy implements IBuilderStrategy
{
//总额
public $totalMoney;
//红包数量
public $num;
//随机红包最⼩值
public $minMoney;
//随机红包最⼤值
public $maxMoney;
//修数据⽅式:NO_LEFT: 红包总额 = 预算总额;CAN_LEFT: 红包总额 = 预算总额public $formatType;
//预算剩余⾦额
public $leftMoney;
public function __construct($option = null)
{
if($option instanceof OptionDTO)
{
$this-setOption($option);
}
}
public function setOption(OptionDTO $option) {
$this-totalMoney = $option-totalMoney;
$this-num = $option-num;
$this-formatType = $option-randFormatType; $this-minMoney = $option-rangeStart;
$this-maxMoney = $option-rangeEnd;
$this-leftMoney = $this-totalMoney;
}
/**
* 创建随机红包
*
* @access public
* @return void
*/
public function create()
{
$data = array();
if(false == $this-isCanBuilder())
{
return $data;
}
$leftMoney = $this-leftMoney;
for($i = 1;$i = $this-num;$i++)
{
$data[$i] = $this-fx($i);
$leftMoney = $leftMoney - $data[$i];
}
//修数据
list($okLeftMoney,$okData) = $this-format($leftMoney,$data);
//随机排序
shuffle($okData);
$this-leftMoney = $okLeftMoney;
return $okData;
}
/**
* 是否能够发随机红包
* @access public
* @return void
*/
public function isCanBuilder()
{
if(false == is_int($this-num) || $this-num = 0)
{
return false;
}
if(false == is_numeric($this-totalMoney) || $this-totalMoney = 0) {
return false;
}
//均值
$avgMoney = $this-totalMoney / 1.0 / $this-num;
//均值⼩于最⼩值
if($avgMoney $this-minMoney )
{
return false;
}
return true;
}
/**
* 获取剩余⾦额
* @access public
public function getLeftMoney()
{
return $this-leftMoney;
}
/**
* 随机红包⽣成函数。三⾓函数。[(1,0.01),($num/2,$avgMoney),($num,0.01)] * @param mixed $x,1 = $x = $this-num;
* @access public
* @return void
*/
public function fx($x)
{
if(false == $this-isCanBuilder())
{
return 0;
}
if($x 1 || $x $this-num)
{
return 0;
}
$x1 = 1;
$y1 = $this-minMoney;
//中间点
$x2 = ceil($this-num / 1.0 / 2);
//我的峰值
$y2 = $this-maxMoney;
//最后点
$x3 = $this-num;
$y3 = $this-minMoney;
//当x1,x2,x3都是1的时候(竖线)
if($x1 == $x2 $x2 == $x3)
{
// '/_\'三⾓形状的线性⽅程
//'/'部分
if($x1 != $x2 $x = $x1 $x = $x2)
{
、 $y = 1.0 * ($x - $x1) / ($x2 - $x1) * ($y2 - $y1) + $y1; return number_format($y, 2, '.', '');
}
//'\'形状
if($x2 != $x3 $x = $x2 $x = $x3)
{
$y = 1.0 * ($x - $x2) / ($x3 - $x2) * ($y3 - $y2) + $y2; return number_format($y, 2, '.', '');
}
return 0;
}
/**
* 格式化修红包数据
*
* @param mixed $leftMoney
* @param array $data
* @access public
* @return void
*/
private function format($leftMoney,array $data)
{
//不能发随机红包
if(false == $this-isCanBuilder())
{
return array($leftMoney,$data);
}
//红包剩余是0
if(0 == $leftMoney) //⽆需修数据
return array($leftMoney,$data);
}
//数组为空
if(count($data) 1)
{
return array($leftMoney,$data);
}
//如果是可以有剩余,并且$leftMoney 0
if('Can_Left' == $this-formatType
$leftMoney 0)
{
return array($leftMoney,$data);
}
// 如果还有余钱,则尝试加到⼩红包⾥,如果加不进去,则尝试下⼀个。while($leftMoney 0)
{
$found = 0;
foreach($data as $key = $val)
{
//减少循环优化
if($leftMoney = 0)
{
break;
}
//预判
$afterLeftMoney = (double)$leftMoney - 0.01;
$afterVal = (double)$val + 0.01;
if( $afterLeftMoney = 0 $afterVal = $this-maxMoney)
{
$found = 1;
$data[$key] = number_format($afterVal,2,'.','');
$leftMoney = $afterLeftMoney;
//精度
}
}
//如果没有可以加的红包,需要结束,否则死循环
//也就是会出现每个红包不分钱的情况,⽐如红包都已经最⼤值。这时必须在分的时候给予标志,防⽌死循环。if($found == 0)
{
break;
}
}
//如果$leftMoney 0 ,说明⽣成的红包超过预算了,需要减少部分红包⾦额
while($leftMoney 0)
{
$found = 0;
foreach($data as $key = $val)
{
if($leftMoney = 0)
{
break;
}
//预判
$afterLeftMoney = (double)$leftMoney + 0.01;
$afterVal = (double)$val - 0.01;
if( $afterLeftMoney = 0 $afterVal = $this-minMoney)
{
$found = 1;
$data[$key] = number_format($afterVal,2,'.','');
$leftMoney = $afterLeftMoney;
$leftMoney = number_format($leftMoney,2,'.','');
}
}
//如果⼀个减少的红包都没有的话,需要结束,否则死循环
if($found == 0)
{
}
}
return array($leftMoney,$data);
}
}
//维护策略的环境类
class RedPackageBuilder
{
// 实例
protected static $_instance = null;
/**
* Singleton instance(获取⾃⼰的实例)
*
* @return MemcacheOperate
*/
public static function getInstance()
{
if (null === self::$_instance)
{
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 获取策略【使⽤反射】
*
* @param string $type 类型
* @return void
*/
public function getBuilderStrategy($type) {
$class = $type.'PackageStrategy';
if(class_exists($class))
return new $class();
}
else
{
throw new Exception("{$class} 类不存在!");
}
}
public function getRedPackageByDTO(OptionDTO $optionDTO)
{
//获取策略
$builderStrategy = $this-getBuilderStrategy($optionDTO-builderStrategy); //设置参数
$builderStrategy-setOption($optionDTO);
return $builderStrategy-create();
}
}
class Client
{
public static function main($argv)
{
//固定红包
$dto = OptionDTO::create(1000,10,100,100,'Equal');
$data = RedPackageBuilder::getInstance()-getRedPackageByDTO($dto);
//print_r($data);
//随机红包[修数据]
$dto = OptionDTO::create(5,10,0.01,0.99,'RandTriangle');
$data = RedPackageBuilder::getInstance()-getRedPackageByDTO($dto); print_r($data);
//随机红包[不修数据]
$dto = OptionDTO::create(5,10,0.01,0.99,'RandTriangle','Can_Left');
$data = RedPackageBuilder::getInstance()-getRedPackageByDTO($dto);
//print_r($data);
}
¥
5.9
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
微信红包随机数字_微信随机红包数详解和算法代码
微信红包随机数字_微信随机红包数详解和算法代码
1 需求
写⼀个固定红包 + 随机红包
固定红包就是每个红包⾦额⼀样,有多少个就发多少个固定红包⾦额就⾏。
随机红包的需求是。⽐如红包总⾦额5元,需要发10个红包。随机范围是 0.01到0.99;5元必需发完,⾦额需要有⼀定趋势的正态分布。
(0.99可以任意指定,也可以是 avg * 2 - 0.01;⽐如avg = 5 / 10 = 0.5;(avg * 2 - 0.01 = 0.99))
第 1 页
2 需求分析
2.1 固定红包
如果是固定红包,则算法是⼀条直线。t就是固定红包的额度。如图。
f(x) = t;(1 = x = num)
image.png
2.2 随机红包
如果我们使⽤随机函数rand。rand(0.01,0.99);那么10次随机,如果最坏情况都是⾦额0.99,总⾦额就是9.9元。会超过5元。⾦额也会不正态分布。最后思考了⼀下借助与数学函数来当作随机红包的发⽣器,可以⽤抛物线,三⾓函数。最后选定了等腰三⾓线性函数。
第 2 页
1 算法原理
如果需要发红包总⾦额是totalMoney,红包个数是num个,⾦额范围是[min,max],线性⽅程如图。
image.png
三个点的坐标:
(x1,y1) = (1,min)
(x2,y2) = (num/2,max)
(x3,y3) = (num,min)
确定的线性⽅程:
$y = 1.0 * ($x - $x1) / ($x2 - $x1) * ($y2 - $y1) + $y1 ; (x1 = x = x2)
第 3 页
$y = 1.0 * ($x - $x2) / ($x3 - $x2) * ($y3 - $y2) + $y2; (x2 = x = x3)
修数据:
y(合) = y1 + y2 + y3 +...... ynum;
y(合)有可能 totalMoney ,说明⽣成⾦额多了,需要修数据,则从(y1,y2,y3.....ynum)这些每次减少0.01。直到y(合) = totalMoney。
y(合)有可能 totalMoney ,说明⽣成⾦额少了,需要修数据,则从(y1,y2,y3.....ynum)这些每次加上0.01。直到y(合) = totalMoney。
第 4 页
2 算法原理样例
如果需要发红包总⾦额是11470,红包个数是7400个,⾦额范围是[0.01,3.09],线性⽅程如图。
image.png
3 需求设计
3.1 类图设计
image.png
3.2 源码设计
/**
* 随机红包+固定红包算法[策略模式]
第 5 页
*/
//配置传输数据DTO
class OptionDTO
{
//红包总⾦额
public $totalMoney;
//红包数量
public $num;
//范围开始
public $rangeStart;
第 6 页
//范围结算
public $rangeEnd;
//⽣成红包策略
public $builderStrategy;
//随机红包剩余规则
public $randFormatType; //Can_Left:不修数据,可以有剩余;No_Left:不能有剩余public static function create($totalMoney,$num,$rangeStart,$rangEnd, $builderStrategy,$randFormatType = 'No_Left')
第 7 页
{
$self = new self();
$self-num = $num;
$self-rangeStart = $rangeStart;
$self-rangeEnd = $rangEnd;
$self-totalMoney = $totalMoney;
$self-builderStrategy = $builderStrategy;
$self-randFormatType = $randFormatType;
return $self;
展开全文
App内免费读全文
前往文库APP签到领畅读卡,免费读微信红包随机数字...全文
限免
导长图
转存到网盘
发送至微信
下载文档
北京百度网讯科技有限公司 版本号8.0.70 隐私政策 权限说明
版权说明:本文档由用户提供并上传,收益专属归内容提供方,若内容存在侵权,请进行举报或认领
第 8 页



为您精选微信红包随机数字...会员文档964篇
微信红包随机金额生成算法模拟及应用
2537人阅读
微信红包随机金额生成算法模拟及应用
1455人阅读
微信红包金额真的是随机分配的吗?
2391人阅读
微信红包算法分析及实现
2508人阅读
获取全部文档4326人在看
基于你的浏览为你整理资料合集

微信红包随机数字_微信随机红包数详解和算法代码
文件夹

微信红包规律分析 - 百度文库
3.6分
2906阅读
人气好文
五块五个包怎么猜红包尾数 - 百度文库
4.4分
1082阅读
微信红包随机金额生成算法模拟及应用 - 百度文库
4.0分
1491阅读
近期下载量飙升
剩余10篇精选文档

前往APP一键获取全部合集
相关文档
微信红包随机金额生成算法模拟及应用
免费获取全文
微信红包随机金额生成算法模拟及应用
免费获取全文
微信红包金额真的是随机分配的吗?
免费获取全文
微信红包算法分析及实现
免费获取全文
微信发红包数字含义大全课件.doc
2567人已阅读
行业好评
微型计算机系统微机原理及应用试题库及答案(可编辑)
2060人已阅读
百里挑一
计算机网络系统投标书(技术部分)
1569人已阅读
网络安全设备-网闸[整理版]
1108人已阅读
ASP导出Excel数据的四种方法
2213人已阅读
学校开展网络安全教育活动方案
1822人已阅读
第3篇 综合应用篇 综合案例5 计算机网络应用综合案例
2470人已阅读
CPU针脚断了怎么焊接
1218人已阅读
数据结构顺序表的查找插入与删除
1594人已阅读
网络安全建设实施方案
1331人已阅读
网络安全检查自查表
1489人已阅读
查看更多
推荐文档集
Q5: Python自动抢红包,超详细教程,再也不会错过微信红包了
提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一个前提条件:手机需要root,对于苹果手机的话就需要越狱了。现在的手机想要root或越狱并不容易,同时这会对手机安全性带来一些风险,抢红包本身只是个 娱乐 活动,这样做就得不偿失了。
为了自动抢红包,python能帮我们实现吗?
答案是肯定的,本文就带大家一起 探索 下用Python如何实现自动抢红包。
操作系统:Windows
Python版本:3.7.2
手机系统:Android
这里我们的需求是实现自动抢红包。首先要打开微信,进入到指定的群聊,识别微信红包、执行抢红包的动作。这就是关键的步骤,简单清晰。
因为电脑版本的微信没有抢红包的功能,我们只能手机微信,那么就需要把手机连上电脑,通过电脑控制手机来自动抢,那就需要确保「 adb 」命令可正常执行。
识别微信中的消息,是红包还是普通的信息,这里我们通过聊天消息的元素标识来判断。这里我们借助了「 Airtest IDE 」工具来实现。
要正常使用「adb」需要打开USB调试,设置项通常出现在手机系统设置中的[开发人员选项]里面。
在手机上打开USB调试后,接下来我们通过Airttest IDE验证 adb 运行是否正常。
开始之前先,先解释下airttest相关概念:
Airtest IDE 的下载地址:
下载之后,解压打开就可以使用,Airtest IDE的界面如下:
使用AirtestIDE对Android应用进行自动化操作,第一步就需要连接Android设备。
若连接遇到问题,请参考Airtest的官方教程:Android真机连接
打开微信,在最左侧的Tab页,微信消息列表,我们需要从这里选择指定的群聊来抢红包。
在AirtestIDE中,我们可以通过暂停功能,冻结当前的UI树形结构来精确地检视UI控件,我们先来分析下这个页面中元素标识。
聊天页面中整体的群聊消息的元素标识 com.tencent.mm:id/d1v
聊天页面中单个群聊消息的元素标识 com.tencent.mm:id/b6e
接下来进入我们准备要抢红包的群聊中,识别出红包并执行抢红包的动作。
我们先来看看红包的标识:
红包标识的示例1 com.tencent.mm:id/aql
红包标识的示例2 com.tencent.mm:id/aql
点击红包,记录下弹出的大红包页面中“开”的元素标识
大红包页面中”开“的标识 com.tencent.mm:id/d02
这里我们需要判断是红包是否有效,比如已被领完或是已被自己领取的红包就是无效的,我们在执行时可以跳过这些。
已领取红包的标识 com.tencent.mm:id/apk
已被领完红包的标识 com.tencent.mm:id/apk
我们用的各元素的标识都已取到,接下来就是组织我们的代码。
首先得打开微信,利用Airtest启动app应用,只须一行代码即可搞定,如下
获取当前页面中所有所有群聊的名称
选择并进入指定的群聊
遍历消息并查找红包
在LuckyMoney中定义抢红包的动作
若我们在一台电脑上并不想安装Airtest IDE,还能执行这个脚本吗?
当然可以,只需要安装好「 pocoui 」这个第三方库就可以“抛弃”它了!
利用 AirtestIDE 创建一个项目时,设备类型选中 Android,就会在编码区生成一段初始化的代码。
我们自己编写的Python代码中也需要加上这段初始化的代码。
再次强调,在执行脚本时要确保手机连上电脑,并确保「adb」命令正常运行。
对Airtest有兴趣的小伙伴,可以参考airtest官方教程:AirtestIDE官方文档
评论区评论: python抢红包 ,获取本文所涉及的完整代码
Python发红包的函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python发红包算法、Python发红包的函数的信息别忘了在本站进行查找喔。







