通过微信红包的用户在除夕夜发送的总次数达到10亿1000万次,与波浪相互作用的量达到110亿次,和红包的峰值传输是每分钟8亿1000万次。

除了微信红包的市场价值,该红包本身的算法也引起了激烈的争论。因为官员们没有给出明确的声明,他们也有不同的意见。

首先看数据分析

大多数人自己猜,这是唯一的选择,当我们不知道内部随机算法,但大多数人不给自己的结果。这里是一个样本的100个样本数据样本,并提出自己的猜测。



1个数字。钱包满足截尾正态随机数的分布,一般在截尾正态分布中取随机数,用和数分割总值得到校正因子。然后我们把所有的随机数和修正因子相乘,得到所有的红色数。

这种分布意味着在平均值之下有更多的红色包,但它们离平均值不远,但红包高于平均值,但红包比平均值大得多。




图1。钱包值及其频数分布直方图及其正态拟合



但我们不能看到分布直方图与正态分布一致。但考虑到程序的简洁性和随机数的合理性,这是最合理的猜测。

钱包的背面越多,其价值一般越高。






图2。荷包序列数与其价值的关系曲线

从线性拟合的红色的线,在图2中,我们可以看到,钱包值总体趋势是缓慢增加,其变化范围约为绿色虚线。(曲线可以用这样一种积极的跳出常规的渠道,也从侧面反映了1个法律的合理性,这是不均匀分布随机数的囤积)

这个规则也可以从另一个平均数的图表中看出。






图3。平均数随数列的变化曲线

在样本中,1000的钱包被分为100个,平均值为10,但是,在图3中,我们可以看到,在最后一个钱包之后,平均数一直低于10,这意味着钱包的开始值很低,并且被后来钱包的价值所拖累。后钱包的价值甚至更高。

三.当然,平均数字也可以揭示另一条规则,即最后一个人往往更容易获得幸运。因为最后一个人拿了很多钱包,而以前所有人的平均数都不到10,所以至少最后一个人会高于平均水平。在这个例子中,98号钱包抽35,最后一个钱包抽46。

总之,根据样本,猜测:






1。你所赚的钱和别人一样少,但再一次,你就容易多了。

2。钱包越多,钱就越容易。

三.最后一个人通常很容易被击中。

点评:这显然很实用,也有区别。每一次一个小编辑都在抢它,这是几美分。



第二个学生写了一个简单的Python代码。



根据观察,红包满足以下几点:

1。没人拿不到钱。



2。不会提前分开



三.货币波动幅度大。



当红色包在一开始创建时,分配方案被设置。



因此Python代码如下所示:


DEF weixin_divide_hongbao(钱、N):
divide_table = { random.randint(1, 10000)
为x的xrange(0,n)}
sum_ =总和(divide_table)
返回{ x *钱/ sum_ X在divide_table }


但是算法中有两个小问题。

1。浮点数精度问题



2。边界值的处理

第三根据学生写的Python版本的java,这是网上流传的


int = 1;
同时(J<1000)
{
整数= 10;
浮点总数= 100;
浮动货币;
双min=0.01;
双最大;
int = i 1;

数学=新的列表(列表);
同时(i <数字)
{

max =总的最小*(数字i);
int k =(int)((number-i) / 2);
如果(我2号)
{数字= i;}
马克斯=最大/ K;
钱=(int)(民* 100 + Math.random()*(最大值×100分钟×100 + 1));
货币=(浮动)货币 100;
总金额=总金额;
math.add(钱);
System.out.println(+我+个人+金钱+左+总);
++;
如果(i =数字)
{
Math.add(总);
System.out.println(+我+个人+总+左0);
}
}

System.out.println(红包+(math.indexof(Collections.max(数学))+ 1)+个人好运);
++;
}


这第四个学生的算法看起来很科学。



他认为:



1,每个人都应该能收到红包。



2。每个人收到的红包总数=总数;



3、每人收到一个红包的数额,但也不能太差,否则就不感兴趣了;



4,算法必须简单,否则我很抱歉腾讯的标志;



在形式化编码之前,建立一个渐进模型来分析规则。



总金额10元,随机抽取N人:



n = 1



红包的金额是x元。



n = 2



为了确保第二个红包能够正常发出,第一个红色包的数量从0.01到9.99是一个随机数。



第二红包= 10 -第一红包金额;



n = 3



在1=0.01和0.98之间的随机数的红色数据包。



一个随机数的红包2 = 0.01(10红包1-0.01)



红色包3 = 10 -红色包1 -红色包2



......




int = 1;
同时(J<1000)
{
整数= 10;
浮点总数= 100;
浮动货币;
双min=0.01;
双最大;
int = i 1;

数学=新的列表(列表);
同时(i <数字)
{

max =总的最小*(数字i);
int k =(int)((number-i) / 2);
如果(数字I 2)
{数字= i;}
马克斯=最大/ K;
钱=(int)(民* 100 + Math.random()*(最大值×100分钟×100 + 1));
货币=(浮动)货币 100;
总金额=总金额;
math.add(钱);
System.out.println(+我+个人+金钱+左+总);
++;
如果(i =数字)
{
Math.add(总);
System.out.println(+我+个人+总+左0);
}
}

System.out.println(红包+(math.indexof(Collections.max(数学))+ 1)+个人好运);
++;
}


进去看看,波动太大了,这个数据太无聊了!



第一个红包:7.48元,余额:2.52元。



第二红包:1.9元,余额:0.62元。



第三个红包:0.49元,余额:0.13元。



第四个红包:0.04元,余额:0.09元。



第五个红包:0.03元,余额:0.06元。



第六个红包:0.03元,余额:0.03元。



第七个红包:0.01元,余额:0.02元。



第八个红包:0.02元,余额:0元。



改进,用平均值作为随机安全极限来控制波动




int = 1;
同时(J<1000)
{
整数= 10;
浮点总数= 100;
浮动货币;
双min=0.01;
双最大;
int = i 1;

数学=新的列表(列表);
同时(i <数字)
{

max =总的最小*(数字i);
int k =(int)((number-i) / 2);
如果(我2号)
{数字= i;}
马克斯=最大/ K;
钱=(int)(民* 100 + Math.random()*(最大值×100分钟×100 + 1));
货币=(浮动)货币 100;
总金额=总金额;
math.add(钱);
System.out.println(+我+个人+金钱+左+总);
++;
如果(i =数字)
{
Math.add(总);
System.out.println(+我+个人+总+左0);
}
}

System.out.println(红包+(math.indexof(Collections.max(数学))+ 1)+个人好运);
++;
}


输出结果如下所示

第一个红包:0.06元,余额:9.94元。



第二红包:1.55元,余额:8.39元。



第三个红包:0.25元,余额:8.14元。



第四个红包:0.98元,余额:7.16元。



第五个红包:1.88元,余额:5.28元。

第六个红包:1.92元,余额:3.36元。



第七个红包:2.98元,余额:0.38元。



第八个红包:0.38元,余额:0元。



总结:



萧边认为它可以理解为一个由小红包引起的谋杀,只列出几个,有些工科学生直接抛出离散函数数学模型,等等,但算法是否简单或复杂,玩得够开心的了。