① 50块25个拼手气红包怎么分配
微信拼手气红包算法分析
热度:5 关键字:分析 时间:2022-12-04 20:30:27
好长一段时间了,身边的朋友都是在揣着手机一直在抢红包,都知道抢红包是一件非常有趣的事,还会有人因为抢红包手气差而生气,其实我们是不知道微信红包随机的算法,其实微信红包不单单是靠手气抢大小的,它中间藏着很深的数据算法,只不过我们不知道而已,我们今天就来讨论一下微信红包的算法!小编精心为大家准备了一下相关材料,大家可以好好的看一看下面柱形图和指数分布柱形图所得出的红包获取平均值,具体数据就在下文哦,感兴趣的小伙伴们来看吧!
首先,我们来讨论一下为什么要采用截尾正态分布。介绍一种非常直接的方法:如果我有50元,要发给25人。那么我用连续均匀分布随机产生24个位于0到50之间的数字。这24个数字将整个0-50的区间划分为25份,分别分给这25个人。事实真的是这样吗?学过序列统计的人应该知道,由于这24个点是连续均匀分布产生的,因此他们的序列统计量也是连续均匀分布产生的,因此他们之间的间隔的分布是指数分布的。具体证明从略,
如果没有序列统计的背景,我们也可以做一个模拟。我有60元钱,按照上述数据产生机理随机分成60份(因此人均1元左右),反复操作10000次,对数据采取聚集后的归一化处理。由于中心极限定理(Central Limit Theorem),该分布反应整体分布(Population Distribution)。画出柱形图如下:
可见是符合指数分布的。
这种产生机理不好的地方在于:大多数人得到的钱非常少,而极少数人得到的钱却非常多,因此可能有一个公平性的问题,而这可能会对抽取人的积极性产生影响。截尾正态分布能够更好地避免这样的问题,因为更多人的红包大小会聚集在平均值附近,而且由于尾部更快的衰减,因此获得特别大的红包的概率也会相应减小,有助于增加公平性与参与的积极性。这一点佐证了土豆的观点,尽管具体截尾的方位可能需要获取更多的数据才有可能有一个准确的预测。
以下是我的两个样本的柱形图:
大家可以比照我的柱形图与上面指数分布柱形图。注意到:
1.更多的人获得的红包在均值附近;
2.获取大于2.5元的红包的概率几乎为零(事实上,第一个钱包的最高值是2.06,第二个钱包的最高值是2.10。然而假设是指数分布的(或者说均匀连续分布的数据产生机理),那么在每个60元红包中都会有一定量的抽取者抽到大于3甚至大于4元的红包--这点我通过模拟也确认了。
我进一步对正态假设做了检验
接下去我讨论一下获取钱包大小和抢钱包先后的关系。我的结论是,红包大小和抢红包先后没有统计意义上的关联。
② 微信中发红包时怎么平均分配
微信红包有两种,一种就是拼手气红包,还有一种就是普通红包,普通红包就属于平均分配!
③ 微信红包的随机算法是怎样的
1)红包大小服从截尾正态分布,其好处是减少抽取红包大小分布的方差,让更多的人抽取的红包在均值附近,同时仍给一小部分人抽取大红包的机会,总体来说增加了红包抽取人的积极性和游戏的公平性;
2)抽取红包大小与抽取红包先后无相关性。一种可能的红包产生机制是:当发红包者<准备红包>的时候,程序自动依照截尾分布产生了相应大小,相应个数的红包,然后随机发给抽取红包的人。同样,这样的一个随机过程有助于增加游戏的公平性,也减少了红包抽取人投机操作。
钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。
这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包
④ 微信红包的随机算法是怎样实现的
自微信红包推出以来,对于微信红包的我算法很多人都在做出自己的猜测,这也是在不知道内部随机算法的时候的唯一选择,但是大多数人没有给出自己亲自的调查结果。这里给出一份100样本的调查抽样样本数据,并提出自己的猜测。
1.钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。
这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包偏多。
图1. 钱包价值与其频率分布直方图及其正态拟合
但看分布直方图并不能推出它符合正态分布,但是考虑到程序的简洁性和随机数的合理性,这是最合乎情理的一种猜测。
2.越是后面的钱包,价值普遍更高
图2. 钱包序列数与其价值关系曲线
从图2中的线性拟合红线可以看到,钱包价值的总体变化趋势是在慢慢增大,其变化范围大约是一个绿色虚线上下界划出的“通道”。(曲线可以被围在这么一个正合乎常规的“通道”中,也从侧面反映了规律1的合理性,说明了并不是均匀分布的随机数)
从另一个平均数的图中也可以看出这一规律。
图3. 平均数随序列数的变化曲线
在样本中,1000价值的钱包被分成100份,均值为10。然而在图3中我们可以看到在最后一个钱包之前,平均数一直低于10,这就说明了一开始的钱包价值偏低,一直被后期的钱包价值拉着往上走,后期的钱包价值更高。
3.当然平均数的图还可以透露出另一个规律,那就是最后的那一个人往往容易走运抽得比较多。因为最后那一个人是钱包剩下多少就拿多少的,而之前所有人的平均数都低于10,所以至少保证了最后一个人会高于平均值。在本样本中,98号钱包抽到35,而最后一份钱包抽到46。
综上,根据样本猜测:
1.抽到的钱大多数时候跟别人一样少,但一旦一多,就容易多很多。
2.越是抽后面的钱包,钱越容易多。
3.最后一个人往往容易撞大运。
其实这些一点用的没有,就是自己闲了无聊开一开脑洞,大家也别认真,玩红包其实就是开心就好啦
⑤ 微信红包的随机算法是怎样实现的
下面是一个比较拙的算法,真实的红包随机数要稍微复杂些:
classProgram
{
staticvoidMain(string[]args)
{
double[]hb=WeiXin.Hongbao(5,1);
for(inti=0;i<5;i++)
{
Console.WriteLine(hb[i]);
}
}
}
///<summary>
///微信类
///</summary>
publicclassWeiXin
{
///<summary>
///红包随机分配
///</summary>
///<paramname="personNumber">红包个数</param>
///<paramname="money">金额</param>
///<returns></returns>
publicstaticdouble[]Hongbao(intpersonNumber,doublemoney)
{
Randomrand=newRandom();
doublefen=money;
double[]hb=newdouble[personNumber];
doublerm=0D;
//预分配
for(inti=0;i<personNumber;i++)hb[i]=0.01;
fen-=(personNumber*0.01);
if(fen>0.01)
{
//随机分配
while(fen>0)
{
rm=GetRandomNumber(0.01,fen);
hb[rand.Next(0,personNumber)]+=rm;
fen-=rm;
}
}
returnhb;
}
///<summary>
///返回介于minimum和maximum之间的随机数
///</summary>
///<paramname="minimum">最小值</param>
///<paramname="maximum">最大值</param>
///<returns></returns>
(doubleminimum,doublemaximum)
{
Randomrandom=newRandom();
returnMath.Round(random.NextDouble()*(maximum-minimum)+minimum,2);
}
}
⑥ 微信群里面发红包,群里成员领到的红包金额是怎么计算的,是随机的还是怎么来的
微信群里发的红包,在默认状态下都是随机领的,有的多,有的少,但是如果你想评论发,也可以设置的,所以看你是什么情况的。
⑦ 微信红包金额怎么分配
微信红包分两种:
1、单独发给一个人的,红包都归个人;
2、红包发到群里的,会随机分配;
但根据个人发红包的经验,头两个和倒数四到五个,通常拿不到最大的红包。
最容易拿到大红包的,是倒数第一第二,通常都是手气最佳。
根据个人的经验。
⑧ 微信红包的随机算法是怎样实现的
核心算法就是随机数主要的需求是得出10个红包,同时有一个隐性条件,每个红包中都要有钱,即每个红包至少1分钱。如果是我会这么干(100块分成10个红包),先取10分钱出来,这样可以屏蔽有的红包没钱的问题。剩下9990分钱,把这9990分钱分成10份即可。9990分钱一字排开,用9块板子插到这些钱中间(插板子这事你们肯定都干过),每两块板子中有多少钱就是一个红包中的钱数了,再加上之前取出的1分钱就是最后的红包了。怎么找插板子的位置呢?取0到1之间的随机数乘9991就好了,重复做9次。第1块板之前的钱加1分就是第一个红包里的钱数,依此类推得出10个红包中的钱数。之后要测试这种方法是不是平均的分了。分个一万次,嗯,反正电脑不会累。回答完毕。微信的红包表现还挺好的 也就卡个10来分钟。。。想发的可以先塞钱,过10分钟再发。

⑨ 微信红包的随机算法是怎样实现的
我考虑了一个简单的算法:
比如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满,红包发完。
⑩ 微信红包的随机算法是怎样实现的
一个红复包要分10份的话,就取制10个0.01到0.99的随机数,按照这10个数分配红包,来的人随机给。
当然10个随机数的和不能超过1,做法可以这样:
1. 维护一个当前剩余比例Rest,初始1
2. 维护一个当前剩余红包份数Left,初始10
3. 每次算随机数A的时候,要求A>0,并且A<=Rest*((Left+1)/2),保证随机数的和在1之内,并且没有哪个随机数太大,更新Rest=Rest-A
4. 最后一个随机数可以不按照3的要求,把所有的给它,也可以留做红包的剩余返回给用户。