发布网友 发布时间:2022-04-22 21:04
共16个回答
懂视网 时间:2022-04-18 12:33
实例如下:
</pre><pre name="code" class="python">#! /usr/bin/python # -*- coding: utf-8 -*- import random class CDispatch: def __init__(self,sum,count): self.sum = sum self.count=count #print 'init here sum =',sum,',count =',count def __del__(self): pass #print 'run del the class' def getListInfo(self): listInfo=[] sumMoney = self.sum*100 for num in range(0,self.count): if(num == self.count -1): listInfo.append(float('%0.2f'%sumMoney)/100) break bigRand=sumMoney+1+num-self.count #print 'sumMoney=',sumMoney,'num=',num,'self.count=',self.count,'big=',bigRand try: a = random.randint(1,int(bigRand)) except: for i in range(0,num): print 'listInfo[%d]'%i,'=',listInfo[i] if num >0: print 'sumMoney=',sumMoney,'num=',num,'listInfo[num-1]=',listInfo[num-1],'self.count=',self.count,'big=',bigRand #print 'a=',a break sumMoney -=a listInfo.append(float(a)/100) return listInfo for i in range(0,100000): dispatch = CDispatch(1.05,5) listGet = dispatch.getListInfo() print listGet del dispatch-->
热心网友 时间:2022-04-18 09:41
我们在一个20人的群中,自己发红包以及结合其他人发出红包的情况,整合成两轮的数据。每次金额设置都是20块并且有20个,第一轮是发了15次,第二轮是发了19次,总结成表格,然后为了避免突发的数据影响判断,我们将两轮数据杂糅从而生成了其他的三轮数据,一共是五轮数据。罗列如下表,高亮的数据为最佳手气。每一列的数据最早抢到红包的在最底端,越往上越晚抢。
从所有*的数值(最佳手气金额)可看出,所有最佳手气值都在平均值*2的前后附近(平均值=总金额/红包总个数,这里平均值=20/20=1),事实上确实如此,可通过微信红包分发算法得到验证,算法具体见后文
然后我们选取部分数据开始制作散点图。横轴为1-20,分别表示抢到红包的人的编号,随递增而越早。也就是20代表最早抢到的人。纵轴为金额。同样的形状颜色的点代表一次发红包,然后我们抓取部分数据显示为散点图,越密集代表该顺序位的用户得到的金额越稳定。散点图如下:
规律一:我们可以看到,所有红包大多数金额分布在0.5到1.5元之间,显示为图中方框所示,大部分点都分布在这个位置。然后是顺序位密集程度的对比,可以发现20、19,也就是最先抢到红包的人,小圆圈所示基本的点都集中在小范围,说明先抢红包的人得到的金额会比较稳定,但同时最佳手气的概率也比较低。大圆圈所示的是极不稳定,飘忽的金额分布,表示越晚抢红包得到的金额会飘忽不稳,但同时,抢到最佳手气等大金额的红包概率也比早抢的高。
根据上面的分析,我们又写了一个过滤计数函数,针对金额的分段的红包个数进行统计:
比如2.0-2.5
得到如下金额分布:
折线图:
规律二:绝大多数的红包的金额都集中在1-1.5,也就是说20块钱发20个红包的金额分布集中在比平均数大一点点的附近,同时较大幅超过平均数金额的红包大大少于低于于平均数的红包数量。
那我们继续扩大数据的规模,将几轮数据的均值和标准差分别做成折线图:
综合上面各个折线图的情况,我们可以得到越早抢红包的标准差越小,越晚抢红包的标准差越大,但同时,由均值和总额可以看出来,越早抢红包的均值往往要更高,红包金额得到最佳手气概率也会相对较小,越晚抢红包的人则得到最佳手气等大手气的概率更大。
为了得到更为趋近规律的曲线和规律,我们决定将两轮真实数据合并起来,然后给出幂函数的趋近线(虚线),如下图:
由于均值受极值波动影响较大,所以我们去除一些因为偶然差产生的极端点(圆圈的点)从而发现是递增的趋势。
规律三:可以很明显的看到,均值是随着抢红包的越晚而缓慢递减,标准差值同时也往上递增,这个趋势结合之前的分析,我们猜想,即标准差越大说明,领取到最大的红包和最小红包的风险越大,也就是说越晚抢标准差越大,对于冒险主义者来讲是最好的,因为他有很大概率获得最大的金额,但也大概率获得最小的红包,风险与收益并存;均值越大,说明每次都拿到一个不大不小的红包,虽然获得最小和最大金额红包的概率很小,但起码不亏本,也就是说越早抢,均值越稳定,这比较适合不喜欢冒险的人。
验证预测结果:
21:24分 发送预测结果到另一位同学微信:
随后开始发红包:
结果:
最佳手气为第8个人且金额为1.13
与预测结果一致,规律基本正确!
总结:
(1)最佳手气为1.13块,根据我们推导的预测公式=总额/红包总个数*2*随机数(0-2的double数), 也就是说最佳手气在总额/红包总个数*2值的前后附近。这里我们判断在0.8-1.3之间,推断正确
(2)平均值为0.5元,0.5-0.8元的红包有3个,小于0.5的红包有6个,说明大于平均值的红包个数多于小于平均值的个数。与我们的第二点预测完全正确
(3)最佳手气位置:根据我们的散点图发现,最先抢到红包的人,得到的金额会比较稳定,但同时最佳手气的概率也比较低。表示越晚抢红包得到的金额波动较大,但同时抢到最佳手气等大金额的红包概率也比早抢的高。所以我们推断,最佳手气位置在最后20%-30%之间。
微信红包随机分发算法c++模拟:
基本思路:每次抢到一个红包金额等于:红包剩余金额/红包剩余个数*2*随机数(0-1的double型),如果计算的结果小于等于0.01,则取0.01值
主要代码:
double packages[50000];
double Luckiest_money=0;
void getPackage(int remainSize,double remainMoney){
srand((unsigned)time(NULL));
for(int i=0;i
热心网友 时间:2022-04-18 10:59
当有人在微信群里发了一个 N 人的红包、总金额 M 元,后台大概的技术逻辑如下。
发红包后台操作:
1)在数据库中增加一条红包记录,存储到CKV,设置过期时间;
2)在Cache(可能是腾讯内部kv数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数N。
抢红包后台操作:
1)抢红包分为抢和拆:抢操作在Cache层完成,通过原子减操作进行红包数递减,到0就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在Cache层外面。这里的原子减操作并不是真正意义上的原子减操作,是其Cache层提供的CAS,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆开发现领完了的情况。
2)拆红包在数据库完成:通过数据库的事务操作累加已经领取的个数和金额,插入一条领取流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。拆的时候会实时计算金额,其金额为1分到剩余平均值2倍之间随机数,一个总金额为M元的红包,最大的红包为 M * 2 /N(且不会超过M),当拆了红包后会更新剩余金额和个数。财付通按20万笔每秒入账准备,实际只到8万每秒。
热心网友 时间:2022-04-18 12:34
比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。
第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。
第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2
.。。。
第n份:剩下的钱(100-x1-x2-...-xn),系统由0~(100-x1-x2-...-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn
当用户进来拿红包的时候,系统由0~9之间随机一个数,随机到几,就取第几份红包,然后将这个数存到list里。当之后的用户抽到相同的随机数时,则将这个数+1,如遇相同再+1,直至list满,红包发完。
热心网友 时间:2022-04-18 14:25
微信红包的随机算法是通过后台数据,也就是微信有一套完整的APP后台数据链,通过编程数据来实现随机性红包数额,其实也很简单的程序,微信红包的随机算法是通过后台数据,也就是微信有一套完整的APP后台数据链,通过编程数据来实现随机性红包数额,其实也很简单的程序,,微信红包的随机算法是通过后台数据,也就是微信有一套完整的APP后台数据链,通过编程数据来实现随机性红包数额,其实也很简单的程序,微信红包的随机算法是通过后台数据,也就是微信有一套完整的APP后台数据链,通过编程数据来实现随机性红包数额,其实也很简单的程序
热心网友 时间:2022-04-18 16:33
微信红包的随机算法就是程序员写入一套程序,人们在抢红包的时候,系统就会启动随机算法根据金额大小和分配个数,自动生成大小不等的个数,抢的人就会根据时间不同而抢到金额不同的金额。
热心网友 时间:2022-04-18 18:58
随机,额度在 0.01 和剩余平均值 2 之间。 例如:发 100 块钱,总共 10 个红包,那么平均值是 10 块钱一个,那么发出来的红包的额度在 0.01元~20元之间波动。
当前面 3 个红包总共被领了 40 块钱时,剩下 60 块钱,总共 7 个红包,那么这 7 个红包的额度在:0.01~(60/7 * 2)=17.14之间。
注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。
这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。
如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。
热心网友 时间:2022-04-18 21:39
1. 先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧 2. 后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳”分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?
答:随机,额度在0.01和(剩余平均值x2)之间。 例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。 当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。 注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(老师也觉得上述算法太复杂,不知基于什么样的考虑)。
热心网友 时间:2022-04-19 00:37
微信红包的随机算法是通过固有的程序。来实现大小不同的分配的。作为智能系统随机红包提前分配好每个红包的金额。这是系统分配的。所以他发也是随意发的。人们在发红包或抢红包时系统就会随机。根据金额的大小和分配的个数自动生成大小不一的个数。强代言就会得到不同的金额大小。总之就是随机随意随时金额不同的变化。每次都不一样就有随机性。
热心网友 时间:2022-04-19 03:52
1.直接在(0,100)区间随机9个不重复的数,然后把0和100加进去排个序,这10个红包就是相邻的大数减小数的值
2,随机出来10个正数,每个红包分别是随机出来的的数*100/十个随机数总和
这两种思路实现起来都挺简单易于理解。
如果再深入点,我加些条件,最小红包不能小于3元,或者最大红包不能大于最小红包3倍,抑或有一半红包10块以上怎么办,那么第一种思路就行不通了,而第二个思路却可以大行其道,这里我们定义一个区间系数k,随机取值是在(1,k)取的,如果k=2那么狠明显最大红包不会大于最小红包2倍,而最大红包,最小红包,几个红包大于小于多少最后均可以转化到这个系数k上,而这个k是可以通过临界值求得的,比如最大红包问题,假设红包总额z,发给m个人,最大红包是d,那么通过临界值可以算得k=d*(m-1)/z-d,如果100红包发10人,最大红包20块,那么求得k=1.44,我们就可以按第二种思路在(1,1.44)区间随机10个数然后分别求得10个红包的大小,其他几种限定条件类似也可以求得k
热心网友 时间:2022-04-19 07:23
1.直接在(0,100)区间随机9个不重复的数,然后把0和100加进去排个序,这10个红包就是相邻的大数减小数的值
2,随机出来10个正数,每个红包分别是随机出来的的数*100/十个随机数总和
这两种思路实现起来都挺简单易于理解。
如果再深入点,我加些条件,最小红包不能小于3元,或者最大红包不能大于最小红包3倍,抑或有一半红包10块以上怎么办,那么第一种思路就行不通了,而第二个思路却可以大行其道,这里我们定义一个区间系数k,随机取值是在(1,k)取的,如果k=2那么狠明显最大红包不会大于最小红包2倍,而最大红包,最小红包,几个红包大于小于多少最后均可以转化到这个系数k上,而这个k是可以通过临界值求得的,比如最大红包问题,假设红包总额z,发给m个人,最大红包是d,那么通过临界值可以算得k=d*(m-1)/z-d,如果100红包发10人,最大红包20块,那么求得k=1.44,我们就可以按第二种思路在(1,1.44)区间随机10个数然后分别求得10个红包的大小,其他几种限定条件类似也可以求得k
热心网友 时间:2022-04-19 11:11
微信红包的随机算法,是微信系统里面的算法,它是根据互联*息然后有专门的计算方法是,真的是随机的,算法的,他就是根据每个人的不同,的次数,不可能每个人的运气都好也不可能每个人运气都差,他是随机看网络,或者看手机或者是,再,看字数,反正是有一点,的算法的,是根据计算,形成的,实现的。
热心网友 时间:2022-04-19 15:16
随便看了下,好多人考虑这考虑那,又是红包不能为0又是要完全随机又是先抽后抽期望不同诸如此等,我提供2种思路,可以完全避免这些问题,而且我觉得每个红包应该在第一个人开出前就已经确定好了的,每个人开奖只是按顺序或者随机取其中的值而已
1.直接在(0,100)区间随机9个不重复的数,然后把0和100加进去排个序,这10个红包就是相邻的大数减小数的值
2,随机出来10个正数,每个红包分别是随机出来的的数*100/十个随机数总和
这两种思路实现起来都挺简单易于理解。
如果再深入点,我加些条件,最小红包不能小于3元,或者最大红包不能大于最小红包3倍,抑或有一半红包10块以上怎么办,那么第一种思路就行不通了,而第二个思路却可以大行其道,这里我们定义一个区间系数k,随机取值是在(1,k)取的,如果k=2那么狠明显最大红包不会大于最小红包2倍,而最大红包,最小红包,几个红包大于小于多少最后均可以转化到这个系数k上,而这个k是可以通过临界值求得的,比如最大红包问题,假设红包总额z,发给m个人,最大红包是d,那么通过临界值可以算得k=d*(m-1)/z-d,如果100红包发10人,最大红包20块,那么求得k=1.44,我们就可以按第二种思路在(1,1.44)区间随机10个数然后分别求得10个红包的大小,其他几种限定条件类似也可以求得k
热心网友 时间:2022-04-19 19:37
通过数据的一个随机拆分,然后进行一个随机分配组成的,时用到的也就是数学上面的一些数字组合,是一个编程,是他们团队经过很多次实验和目的相符能够做到随机分配的一个程序,每次就把用户要发的金额带入这一套编程里,计算机自己计算,就实现了随机算法。
热心网友 时间:2022-04-20 00:15
微信红包的随机算法是由微信系统随便分配,红包的数字大小也不一样,比如你一次发十个人的红包是10块钱,系统不是平均分配的,有的抢到几块钱,有的就只抢了几毛钱,十个红包加起来也是10块钱,这就是随机算法。
热心网友 时间:2022-04-20 05:10
1)红包大小服从截尾正态分布,其好处是减少抽取红包大小分布的方差,让更多的人抽取的红包在均值附近,同时仍给一小部分人抽取大红包的机会,总体来说增加了红包抽取人的积极性和游戏的公平性;
2)抽取红包大小与抽取红包先后无相关性。一种可能的红包产生机制是:当发红包者<准备红包>的时候,程序自动依照截尾分布产生了相应大小,相应个数的红包,然后随机发给抽取红包的人。同样,这样的一个随机过程有助于增加游戏的公平性,也减少了红包抽取人投机操作。
钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。
这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包