本申请涉及计算机技术领域,尤其涉及一种计算机系统中随机数的生成方法及装置。
背景技术:
传统技术中,在生成指定个数的随机数时,往往通过调用随机函数来随机生成该指定个数的随机数,然而因为上述随机数是随机生成的,所以无法对其进行有效的控制(如,控制在某一范围内),由此会导致生成的指定个数的随机数分布不均匀的问题。比如,在实现“红包”的发送的场景中,支付服务端随机生成的“红包金额”可能会非常大,也可能会非常小(如,0.01),这会给用户带来较差的体验。
技术实现要素:
本申请描述了一种计算机系统中随机数的生成方法及装置,可以实现对生成的随机数进行有效的控制。
第一方面,提供了一种计算机系统中随机数的生成方法,该方法包括:
接收第一请求,所述第一请求包括待生成的随机数的总和以及个数;
根据所述总和以及所述个数,确定平均数;
将待生成的所述个数的随机数划分为多个子集合,其中,每个子集合包括一个或两个随机数,当子集合包括两个随机数时,所述两个随机数之和为所述平均数的两倍,且所述两个随机数之商为预设阈值;
确定所述多个子集合中每个子集合中的一个或两个随机数,从而得到所述个数的随机数。
第二方面,提供了一种计算机系统中随机数的生成装置,该装置包括:
接收单元,用于接收第一请求,所述第一请求包括待生成的随机数的总和以及个数;
确定单元,用于根据所述接收单元接收的所述总和以及所述个数,确定平均数;
划分单元,用于将待生成的所述个数的随机数划分为多个子集合,其中,每个子集合包括一个或两个随机数,当子集合包括两个随机数时,所述两个随机数之和为所述平均数的两倍,且所述两个随机数之商为预设阈值;
所述确定单元,还用于确定所述多个子集合中每个子集合中的一个或两个随机数,从而得到所述个数的随机数。
本申请提供的计算机系统中随机数的生成方法及装置,在接收到第一请求时,首先将待生成的随机数划分为多个子集合,并在子集合包括两个随机数时,规定两个随机数之和为平均数的两倍,两个随机数之商为预设阈值;之后再依次确定各个子集合中包括的一个或两个随机数,从而得到指定个数的随机数;由此实现了对生成的随机数进行控制的目的。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本申请一种实施例提供的计算机系统中随机数的生成方法流程图;
图2为本申请提供的子集合中随机数的确定方法流程图;
图3为本申请提供的计算机系统中随机数的生成方法的一种应用场景的示意图;
图4为图3所示的场景中一种红包金额的生成方法流程图;
图5为图3所示的场景中另一种红包金额的生成方法流程图;
图6为本申请一种实施例提供的计算机系统中随机数的生成装置示意图。
具体实施方式
下面结合附图,对本发明的实施例进行描述。
本申请提供的计算机系统中随机数的生成方法及装置适用于在待生成的随机数的总和以及个数固定的情况下,生成随机数的场景;尤其适用于在待生成的随机数的总和以及个数固定的情况下,生成分布均匀的随机数的场景。
图1为本申请一种实施例提供的计算系统中随机数的生成方法流程图。所述方法的执行主体可以为具有处理能力的设备:服务器或者系统或者装置,如,支付系统的服务端,如图1所示,所述方法具体可以包括:
步骤110,接收第一请求。
其中,该第一请求可以为任一用于指示上述服务器或者系统或者装置生成随机数的请求。该第一请求中可以包括待生成的随机数的总和以及待生成的随机数的个数等。
步骤120,根据总和以及个数,确定平均数。
此处,平均数可以为总和除以个数得到的商。以“红包”发送的场景为例来说,假设红包总金额为100元,红包数量为10个,则平均分配金额可以为100/10=10元,也即平均每个人可以分配10元。
步骤130,将待生成的个数的随机数划分为多个子集合。
其中,每个子集合包括一个或两个随机数,当子集合包括两个随机数时,两个随机数之和为平均数的两倍,且两个随机数之商为预设阈值。
此处,子集合的数量可以根据待生成的随机数的个数确定,如,子集合的数量可以根据如下公式计算:int(个数/2)或者int(个数/2)+1,其中,int()是取整函数,即其用于获取一个数据的整数部分,具体地,当待生成的随机数的个数为偶数时,可以根据公式:int(个数/2),确定子集合的数量;而当待生成的随机数的个数为奇数时,可以根据公式int(个数/2)+1,确定子集合的数量。可以理解的是,在上述待生成的随机数的个数为偶数的情况下,各子集合中可以都包括两个随机数;而在待生成的随机数的个数为奇数的情况下,则至少有一个子集合只包括一个随机数。
举例来说,假设待生成的随机数的个数为10个,也即待生成的随机数的个数为偶数,因此可以确定子集合的数量为:int(10/2)=5个。对划分得到的5个子集合,当每个子集合均包括两个随机数时,可以规定该两个随机数的和为平均数的两倍,且该两个随机数的商为预设阈值,在对两个随机数作出上述规定之后,该两个随机数就可以构成如下二元一次方程:
其中,s1和s2分别表示子集合中的两个随机数,avg为上述平均数,而gap是指上述预设阈值,其可以根据实际需求确定。
在再一个例子中,假设待生成的随机数的个数为9个,也即待生成的随机数的个数为奇数时,可以确定子集合的数量为:int(9/2)+1=5个。对划分得到的5个子集合,当1个子集合包括1个随机数,而其它子集合包括两个随机数时,也可以规定该两个随机数的和为平均数的两倍,且该两个随机数的商为预设阈值,在对两个随机数作出上述规定之后,该两个随机数也可以构成如上公式1所示的二元一次方程。
需要说明的是,本申请中,通过将子集合中两个随机数的和与商进行相应的规定,可以实现对同一子集合中两个随机数的差距进行控制的目的,且各随机数在中间区域相对平均,也即各随机数是在以平均数为中心划分出的范围之内,由此可以保证生成的随机数分布比较均匀。
步骤140,确定多个子集合中每个子集合中的一个或两个随机数,从而得到所述个数的随机数。
在待生成的随机数的个数为偶数的情况下,根据公式1可以确定出每个子集合中的两个随机数;在确定出每个子集合中的两个随机数之后,就可以得到所述个数的随机数;如前述例子,在确定出5个子集合中的每个随机数之后,就可以得到10个随机数。需要说明的是,当某一子集合中包括1个随机数时,则该一个随机数可以根据平均数数确定,如,可以将平均数随机衰减后作为上述一个随机数,或者,也可以通过其它方式确定,如,直接将平均数作为上述一个随机数,本申请对此不作限定。
需要说明的是,对于子集合中包括两个随机数的情况,上述只是给出了子集合中两个随机数的一种确定方法,在本申请的其它实施方式中,子集合中的两个随机数也可以通过如图2所示的各步骤确定:
步骤210,根据待生成的随机数的个数,确定循环周期。
在一种实现方式中,可以根据公式2确定循环周期。
interval=count/2(公式2)
其中,interval为循环周期,count为待生成的随机数的个数。
步骤220,根据预设阈值,确定分配因子。
在一种实现方式中,可以根据公式3确定分配因子。
primer=(2*gap)/(1+gap)(公式3)
其中,primer为分配因子,gap为预设阈值。
步骤230,根据平均数以及分配因子,确定最大相差倍数。
在一种实现方式中,可以根据公式4确定最大相差倍数。
top=math.min((avg*primer),(2*avg-1))(公式4)
其中,top为最大相差倍数,avg为平均数,primer为分配因子,math.min()为取最小值函数,如,其会比较(avg*primer)与(2*avg-1)两个数的大小,然后取最小的数作为最大相差倍数。
步骤240,根据最大相差倍数、平均数以及循环周期,确定步差。
在一种实现方式中,可以根据公式5确定步差。
stepm=(top-avg)/interval(公式5)
其中,stepm为步差,top为最大相差倍数,avg为平均数,interval为循环周期。
步骤250,根据步差,确定随机数的偏移范围。
在一种实现方式中,可以根据公式6确定随机数的偏移范围。
ri=(int)(1d/(5+random.nextint(25))*stepm)(公式6)
其中,ri为偏移范围,stepm为步差,random.nextint(25)为随机选取0-25之间任一整数的随机函数,根据公式6可以确定ri为[0,1/30*stepm],也即偏移范围为[0,1/30*stepm]。
步骤260,确定在偏移范围内的第一偏移量。
此处的第一偏移量可以是指从偏移范围[0,1/30*stepm]内随机选取的任一值。
步骤270,根据最大相差倍数、步差、当前步长以及第一偏移量,确定两个随机数中的第一随机数。
在一种实现方式中,可以根据公式7确定两个随机数中的第一随机数。
s1=top-(int)((stepgo++)*stepm)-ri(公式7)
其中,s1为两个随机数中的第一随机数,该第一随机数可以是指两个随机数中较大的随机数;top为最大相差倍数;stepgo为当前步长,当确定第一个子集合中的第一随机数时,stepgo可以为0,之后,当确定第二个子集合中的第一随机数时,stepgo可以为1,即每次递增1,这样依次类推;stepm为步差;ri为第一偏移量。
步骤280,根据平均数以及第一随机数,确定两个随机数中的第二随机数。
在一种实现方式中,可以根据公式8确定两个随机数中的第二随机数。
s2=(int)(2*avg)-s1(公式8)
其中,s2为两个随机数中的第二随机数,该第二随机数可以是指两个随机数中较小的随机数;avg为平均数;s1为两个随机数中的第一随机数。
上述是在其它实施方式中,子集合中两个随机数的确定方法,而当子集合只包括一个随机数时,则该一个随机数可以通过如下步骤确定:
对平均数进行随机衰减;
根据随机衰减后的平均数以及预设的最小随机数,确定第二子集合中的一个随机数。
此处的第二子集合可以是指任一只包括一个随机数的子集合。
在一种实现方式中,可以根据公式9确定第二子集合中的一个随机数。
s1=(int)math.max(min,(avg-1-random.nextint(fluctuation)))(公式9)
其中,s1为第二子集合中的一个随机数;min为预设的最小随机数,如,可以为0.01;avg为平均数;fluctuation可以为预先设定的常量,该常量可以为想要对平均数衰减的值;math.max()为取最大值函数,如,其会比较min与(avg-1-random.nextint(fluctuation))两个数的大小,然后取最大的数作为第二子集合中的一个随机数。
回到步骤140中,可以理解的是,在依照一个子集合中一个或者两个随机数的确定方法(如,图2中的各步骤),确定出每个子集合中的一个或者两个随机数之后,就可以得到所述个数的随机数。
可选地,在执行步骤140之后,还可以执行如下步骤:
步骤a:根据总和以及所述个数的随机数,确定剩余数。
需要说明的是,根据传统的方法或者图2中的各步骤得到的所述个数的随机数之和往往并不等于总和。如在“红包”发送的场景中,红包数量的红包金额之和,也即发送的“红包”的金额之和往往并不等于红包总金额,由此就造成了资金亏损的问题。为解决该问题,本申请中,可以根据总和以及所述个数的随机数,确定剩余数,如,可以通过计算总和与所述个数的随机数之和的差值,来确定剩余数。如前述例子,在红包总金额为100元的情况下,假设10个红包金额之和为90元,则剩余金额为10元。
当然,在实际应用中,剩余数也可以在执行图2各步骤的时候确定,由此,可以提高剩余数的确定效率。在一个例子中,可以将剩余数初始化为总和,之后,在每次确定出一个子集合中的一个或者两个随机数之后,就将剩余数更新为剩余数与一个随机数的差值,或者将剩余数更新为剩余数与两个随机数之和的差值,可以理解的是,当所有的子集合中的随机数确定完成之后,更新后的剩余数即为最终的剩余数。
步骤b:对剩余数进行拆分。
在一种实现方式中,可以将剩余数拆分为所述个数的子数据。如前述例子,在剩余金额为10元,而红包数量为10个时,拆分后得到的子数据可以为10个1元。当然,在实际应用中,也可以将剩余数拆分为其它个数的子数据,且各子数据可以不相同,本申请对此不作限定。
步骤c:将拆分后的剩余数叠加至所述个数的随机数中,得到更新后的所述个数的随机数。
举例来说,假设总和:10,待生成的随机数的个数为10个,得到的10个随机数分别为:1.2、0.7、1.1、0.8、1.3、0.6、1.5、0.4、1.0和0.9,则剩余数可以为:0.5;将剩余数0.5拆分为10个0.05;则更新后的10个随机数可以为:1.25、0.75、1.15、0.85、1.35、0.65、1.55、0.45、1.05和0.95。
在“红包”发送的场景下,通过将拆分后的剩余金额叠加至红包数量的红包金额中,可以避免资金损失。
可选地,在执行步骤140之后,或者在执行步骤c之后,还可以执行如下步骤:
步骤x:对所述个数的随机数进行重排序。
此处,可以是按照任意的顺序对所述个数的随机数进行重排序,以避免各随机数按大小顺序存储;此外,还可以保证在待生成的随机数的总和以及个数相同的情况下,连续两次以上划分的所述个数的随机数的顺序不一致。
步骤y:将重排序后的所述个数的随机数存储到列表中。
当然,在实际用中,也可以将重排序后的所述个数的随机数数存储到其它形式的存储单元中,本申请对此不作限定。
需要说明的是,上述步骤x和步骤y中的所述个数的随机数也可以是指叠加了拆分后的剩余数的所述个数的随机数。
需要说明的是,本申请提供的计算机系统中随机数的生成方法可以应用于如图3所示的“红包”的发送的场景,图3中,包括一个发送方客户端以及多个接收方客户端,发送方客户端用于发送“红包”领取通知,接收方客户端用于根据发送方客户端发送的“红包”领取通知,执行相应的“红包”领取操作。需要说明的是,发送方客户端发送“红包”领取通知的方式有多种,以发送方客户端为支付宝客户端为例来说,支付宝客户端发送“红包”领取通知的方式可以包括两种:第一种,支付宝客户端可以在群组中发送“红包”领取通知,该群组可以通过以下步骤建立:通讯录->群聊->选择群类型(如,娱乐群)->选择用户;第二种,发送方用户在“支付宝”应用界面中,通过触发“红包”文字或相应的“红包”图案,即可转入红包生成界面;在红包生成界面,发送方用户输入口令,并在选择的群类型中输入“总金额”以及“红包个数”,之后点击“发红包”后,即可完成“红包”领取通知的发送。可以理解的是,通过上述两种方式发送的“红包”领取通知可以包括“总金额”和“红包个数”等信息。
图3中,在发送方客户端发送“红包”领取通知之后,服务端就可以接收到第一请求,该第一请求中可以包括红包总金额以及待发送的红包数量,之后服务端可以从红包总金额中划分出红包数量的红包金额;当服务端接收到接收方客户端发送的“红包”领取请求时,也即在接收方用户领取红包时,将其中的一个红包金额分配给接收方客户端。
然而,在服务端划分红包数量的红包金额的过程中,通常随机生成每个红包金额,由此服务端随机生成的红包金额可能会非常大,也可能会非常小(如,0.01),也即具有红包金额不可控的问题。
当本申请的计算机系统中随机数的生成方法应用于图3所示的场景中时,可以解决上述红包金额不可控的问题。具体地,当本申请的计算机系统中随机数的生成方法应用于图3所示的场景中时,待生成的随机数的总和相当于红包总金额,待生成的随机数的个数相当于待发送的红包数量,随机数相当于红包金额,而随机数的生成方法可以为红包金额的生成方法,其中,图4提供了一种红包金额的生成方法,图4中,该方法具体可以包括如下步骤:
步骤410,服务端接收发送方客户端发送的第一请求。
该第一请求可以包括红包总金额以及待发送的红包数量。
步骤420,根据红包总金额和红包数量,确定平均分配金额。
此处,平均分配金额可以为红包总金额除以红包数量得到的商。举例来说,假设红包总金额为100元,红包数量为10个,则平均分配金额可以为100/10=10元,也即平均每个人可以分配10元。
步骤430,将待生成的红包数量的红包金额划分为多个红包金额子集合。
其中,每个红包金额子集合包括一个或两个红包金额,当红包金额子集合包括两个红包金额时,两个红包金额之和为平均分配金额的两倍,且两个红包金额之商为预设阈值。
此处,红包金额子集合的数量可以根据待发送的红包数量确定,如,红包金额子集合的数量可以根据如下公式计算:int(红包数量/2)或者int(红包数量/2)+1,其中,int()是取整函数,即其用于获取一个数据的整数部分,具体地,当红包数量为偶数时,可以根据公式:int(红包数量/2),确定红包金额子集合的数量;而当红包数量为奇数时,可以根据公式int(红包数量/2)+1,确定红包金额子集合的数量。可以理解的是,在上述红包数量为偶数的情况下,各红包金额子集合中可以都包括两个红包金额;而在红包数量为奇数的情况下,则至少有一个红包金额子集合只包括一个红包金额。
假设待发送的红包数量为10个,也即红包数量为偶数,因此可以确定红包金额子集合的数量为:int(10/2)=5个。对划分得到的5个红包金额子集合,当每个红包金额子集合均包括两个红包金额时,可以规定该两个红包金额的和为平均分配金额的两倍,且该两个红包金额的商为预设阈值,在对两个红包金额作出上述规定之后,该两个红包金额就可以构成如公式1所示的二元一次方程。
而假设待发送的红包数量为9个,也即红包数量为奇数时,可以确定红包金额子集合的数量为:int(9/2)+1=5个。对划分得到的5个红包金额子集合,当1个红包金额子集合包括1个红包金额,而其它红包金额子集合包括两个红包金额时,也可以规定该两个红包金额的和为平均分配金额的两倍,且该两个红包金额的商为预设阈值,在对两个红包金额作出上述规定之后,该两个红包金额也可以构成如上公式1所示的二元一次方程。
需要说明的是,本申请中,通过将红包金额子集合中两个红包金额的和与商进行相应的规定,可以实现对同一红包金额子集合中两个红包金额的差值进行控制的目的,且各红包金额在中间区域相对平均,也即各红包金额是在以平均分配金额为中心划分出的范围之内,由此可以保证各接收方客户端分配的红包金额相对平均,也即可以保证接收方用户分配的“红包”金额相对平均,这可以提升用户的体验。
步骤440,确定多个红包金额子集合中每个红包金额子集合中的一个或两个红包金额,从而得到红包数量的红包金额。
在红包数量为偶数的情况下,根据公式1可以确定出每个红包金额子集合中的两个红包金额;在确定出每个红包金额子集合中的两个红包金额之后,就可以得到红包数量的红包金额;如前述例子,在确定出5个红包金额子集合中的每个红包金额之后,就可以得到10个红包金额。需要说明的是,当某一红包金额子集合中包括1个红包金额时,则该一个红包金额可以根据平均分配金额确定,如,可以将平均分配金额随机衰减后作为上述一个红包金额。此处,在红包数量为奇数的情况下,通过将平均分配金额随机衰减后赋予最后一个红包金额,可以避免最后一个红包金额固定的问题,由此可以避免不法分子利用这种规律进行不法行为的问题。
需要说明的是,对于红包金额子集合中包括两个红包金额的情况,上述只是给出了两个红包金额的一种确定方法,在本申请的其它实施方式中,红包金额子集合中的两个红包金额也可以通过如图2所示的各步骤确定;即只需将图2所示的各步骤中的平均数替换为平均分配金额,将随机数替换为红包金额即可。
服务端在依照一个红包金额子集合中一个或者两个红包金额的确定方法(如,图2中的各步骤),确定出每个红包金额子集合中的一个或者两个红包金额之后,就可以得到红包数量的红包金额。
可选地,在执行步骤440之后,还可以执行如下步骤:
步骤a:根据红包总金额以及红包数量的红包金额,确定剩余金额。
红包数量的红包金额之和,也即发送的“红包”的金额之和往往并不等于红包总金额,由此就造成了资金亏损的问题。为解决该问题,本申请中,可以根据红包总金额以及红包数量的红包金额,确定剩余金额,如,可以通过计算红包总金额与红包数量的红包金额之和的差值,来确定剩余金额。如前述例子,在红包总金额为100元的情况下,假设10个红包金额之和为90元,则剩余金额为10元。
当然,在实际应用中,剩余金额也可以在执行图2各步骤的时候确定,由此,可以提高剩余金额的确定效率。在一个例子中,可以剩余金额初始化为红包总金额,之后,在每次确定出一个红包金额子集合中的一个或者两个红包金额之后,就将剩余金额更新为剩余金额与一个红包金额的差值,或者将剩余金额更新为剩余金额与两个红包金额之后的差值,可以理解的是,当所有的红包金额子集合中的红包金额确定完成之后,更新后的剩余金额即为最终的剩余金额。
步骤b:对剩余金额进行拆分。
在一种实现方式中,可以将剩余金额拆分为红包数量的子数据。如前述例子,在剩余金额为10元,而红包数量为10个时,拆分后得到的子数据可以为10个1元。当然,在实际应用中,也可以将剩余金额拆分为其它个数的子数据,且各子数据可以不相同,本申请对此不作限定。
步骤c:将拆分后的剩余金额叠加至红包数量的红包金额中,得到更新后的红包数量的红包金额。
举例来说,假设红包总金额为:10元,红包数量为10个,得到的10个红包金额分别为:1.2、0.7、1.1、0.8、1.3、0.6、1.5、0.4、1.0和0.9,则剩余金额可以为:0.5;将剩余金额0.5拆分为10个0.05;则更新后的10个红包金额可以为:1.25、0.75、1.15、0.85、1.35、0.65、1.55、0.45、1.05和0.95。
通过将拆分后的剩余金额叠加至红包数量的红包金额中,可以避免资金损失。
可选地,在执行步骤440之后,或者在执行步骤c之后,还可以执行如下步骤:
步骤x:对红包数量的红包金额进行重排序。
此处,可以是按照任意的顺序对红包数量的红包金额进行重排序,以避免各红包金额按大小顺序存储;此外,还可以保证在红包总金额和红包数量相同的情况下,连续两次以上划分的红包数量的红包金额的顺序不一致。
步骤y:将重排序后的红包数量的红包金额存储到列表中。
当然,在实际用中,也可以将重排序后的红包数量的红包金额存储到其它形式的存储单元中,本申请对此不作限定。
需要说明的是,上述步骤x和步骤y中的红包数量的红包金额也可以是指更新后的红包数量的红包金额。
步骤450,接收接收方客户端发送的第二请求。
该第二请求可以包括接收方用户的标识(例如,接收方用户的账号信息等)。
步骤460,根据第二请求,将红包数量的红包金额中目标金额分配至接收方客户端。
此处的目标金额可以是指红包数量的红包金额中的任一红包金额,或者也可以是指更新后的红包数量的红包金额中任一红包金额。
如,服务端在接收到第二请求之后,可以从列表中读取目标金额;之后将目标金额分配至接收方客户端。
为了更清楚的说明本申请提供的计算机系统中随机数的生成方法在图3所示的“红包”的发送的场景中的应用,本申请给出了如下具体的实施方式。
图5为图3所示的场景中另一种红包金额的生成方法流程图。如图5所示,所述方法具体可以包括:
步骤510,接收发送方客户端发送的第一请求。
可选地,在接收第一请求之前,可以预先设定最小分配金额(如,0.01元)。
该第一请求可以包括红包总金额以及红包数量(count)。
步骤520,判断红包数量(count)是否为1,若是,则执行步骤530;若否,则执行步骤540。
步骤530,将红包总金额放入列表。
步骤540,判断红包总金额是否为红包数量*预设的最小分配金额,若是,则执行步骤550;若否,则执行步骤560。
步骤550,采用平均分配算法将红包总金额划分为红包数量的最小分配金额,并将其放入列表。
步骤560,计算平均分配金额、最大相差倍数、步差以及红包金额的偏移范围,并将剩余金额初始化为红包总金额。
此处,平均分配金额的计算方法可参照步骤120或者420,最大相差倍数、步差以及红包金额的偏移范围可以参照步骤210-步骤250,在此不复赘述。
步骤570,判断是否已确定出红包数量的红包金额,若否,则执行步骤580,若是,则执行步骤5160。
步骤580,判断当前确定的红包金额是否是最后一个红包金额,若是,则执行步骤590;若否,则执行步骤5120。
步骤590,对平均分配金额进行随机衰减。
步骤5100,根据随机衰减后的平均分配金额以及预设的最小分配金额,确定最后一个红包金额。
步骤5110,将最后一个红包金额加入列表中,并将剩余金额更新为剩余金额与最后一个红包金额的差值。
步骤5120,从步骤560中计算的偏移范围之内随机选取任一值作为当前的偏移量。
步骤5130,根据步骤560中计算的最大相差倍数、步差、第一偏移量以及当前步长,计算出一个红包金额。
此处,一个红包金额的计算方法可以参照步骤370。
步骤5140,根据平均分配金额以及一个红包金额,计算另一红包金额。
此处,另一红包金额的计算方法可以参照步骤380。
步骤5150,将剩余金额更新为剩余金额与上述两个红包金额之和的差值,并将一个红包金额与另一红包金额加入列表。
步骤5160,判断剩余金额是否大于0,若是,则执行步骤5170;若否,则执行步骤5180。
步骤5170,对剩余金额进行拆分;将拆分后的剩余金额叠加至红包数量的红包金额中,得到更新后的红包数量的红包金额。
此处,剩余金额的拆分方法以及叠加拆分后的剩余金额的方法可以参照步骤b-步骤c或者步骤b-步骤c。
步骤5180,将红包数量的红包金额或者更新后的红包数量的红包金额进行重排序。
步骤5190,接收接收方客户端发送的第二请求。
步骤5200,将红包数量的红包金额或者更新后的红包数量的红包金额中的目标金额分配至接收方客户端。
本申请的上述实施例具有如下技术效果:
1)通过对红包金额子集合中两个红包金额的和与商的限定,可以实现对划分的红包金额的控制。
2)通过对剩余金额进行拆分,并将拆分后的剩余金额叠加至红包数量的红包金额中,可以保障不会出现资损;此外,还可以保障分配更均匀。
3)通过对红包数量的红包金额进行重排序,可以避免红包数量的红包金额按大小顺序存储。
4)在红包数量为奇数的情况下,通过将平均分配金额随机衰减后赋予最后一个红包金额,可以避免最后一个红包金额固定的问题,由此可以避免不法分子利用这种规律进行不法行为的问题。
当然,本申请提出的计算机系统中随机数的生成方法并不局限于“红包”发送的场景,也可以应用于其它的场景,如商户活动金额分配,本申请对此不作限定。
与上述计算机系统中随机数的生成方法对应地,本申请实施例还提供的一种计算机系统中随机数的生成装置,如图6所示,该装置包括:
接收单元601,用于接收第一请求,该第一请求包括待生成的随机数的总和以及个数。
确定单元602,用于根据接收单元601接收的总和以及个数,确定平均数。
划分单元603,用于将待生成的个数的随机数划分为多个子集合,其中,每个子集合包括一个或两个随机数,当子集合包括两个随机数时,两个随机数之和为平均数的两倍,且两个随机数之商为预设阈值。
确定单元602,还用于确定多个子集合中每个子集合中的一个或两个随机数,从而得到所述个数的随机数。
可选地,确定单元602,还用于根据个数,确定循环周期;
根据预设阈值,确定分配因子;
根据平均数以及分配因子,确定最大相差倍数;
根据最大相差倍数、平均数以及循环周期,确定步差;
根据步差,确定随机数的偏移范围;
确定单元602具体用于:
确定在偏移范围内的第一偏移量;
根据最大相差倍数、步差、当前步长以及第一偏移量,确定两个随机数中的第一随机数;
根据平均数以及第一随机数,确定两个随机数中的第二随机数。
可选地,确定单元602,还用于对平均数进行随机衰减;
根据随机衰减后的平均数以及预设的最小随机数,确定第二子集合中的一个随机数。
可选地,所述装置还包括:拆分单元603和叠加单元604。
确定单元602,还用于根据总和以及所述个数的随机数,确定剩余数;
拆分单元603,用于对确定单元602确定的剩余数进行拆分;
叠加单元604,用于将拆分单元603拆分后的剩余数叠加至所述个数的随机数中,得到更新后的所述个数的随机数。
可选地,所述装置还包括:
排序单元605,用于对所述个数的随机数进行重排序;
存储单元606,用于将排序单元605重排序后的所述个数的随机数存储到列表中。
本申请实施例装置的各功能模块的功能,可以通过上述方法实施例的各步骤来实现,因此,本申请提供的装置的具体工作过程,在此不复赘述。
本申请实施例提供的计算机系统中随机数的生成装置,接收单元601接收第一请求,该第一请求包括待生成的随机数的总和以及个数;确定单元602根据总和以及个数,确定平均数;划分单元603将待生成的个数的随机数划分为多个子集合;确定单元602确定多个子集合中每个子集合中的一个或两个随机数,从而得到所述个数的随机数。由此实现了对生成的随机数进行控制的目的。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。