如何理解随机算法-创新互联

本篇内容介绍了“如何理解随机算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联公司-专业网站定制、快速模板网站建设、高性价比桂东网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式桂东网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖桂东地区。费用合理售后完善,十余年实体公司更值得信赖。

首先看看数据分析帝

大多数人都做出自己的猜测,这也是在不知道内部随机算法的时候的选择,但是大多数人没有给出自己亲自的调查结果。这里给出一份100样本的调查抽样样本数据,并提出自己的猜测。


1. 钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。

这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包偏多。

如何理解随机算法


图1. 钱包价值与其频率分布直方图及其正态拟合


但看分布直方图并不能推出它符合正态分布,但是考虑到程序的简洁性和随机数的合理性,这是最合乎情理的一种猜测。
越是后面的钱包,价值普遍更高


如何理解随机算法


图2. 钱包序列数与其价值关系曲线

从图2中的线性拟合红线可以看到,钱包价值的总体变化趋势是在慢慢增大,其变化范围大约是一个绿色虚线上下界划出的“通道”。(曲线可以被围在这么一个正合乎常规的“通道”中,也从侧面反映了规律1的合理性,说明了并不是均匀分布的随机数)
从另一个平均数的图中也可以看出这一规律。


如何理解随机算法


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

在样本中,1000价值的钱包被分成100份,均值为10。然而在图3中我们可以看到在最后一个钱包之前,平均数一直低于10,这就说明了一开始的钱包价值偏低,一直被后期的钱包价值拉着往上走,后期的钱包价值更高。

3. 当然平均数的图还可以透露出另一个规律,那就是最后的那一个人往往容易走运抽得比较多。因为最后那一个人是钱包剩下多少就拿多少的,而之前所有人的平均数 都低于10,所以至少保证了最后一个人会高于平均值。在本样本中,98号钱包抽到35,而最后一份钱包抽到46。

综上,根据样本猜测:


如何理解随机算法


1. 抽到的钱大多数时候跟别人一样少,但一旦一多,就容易多很多。
2. 越是抽后面的钱包,钱越容易多。
3. 最后一个人往往容易撞大运。

点评:这种明显很实际有差异,小编每次不管什么时候抢都是几毛钱。


第二位同学写了一个简单python 代码


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

1.不会有人拿不到钱


2.不会提前分完


3.钱的波动范围很大


红包在一开始创建的时候,分配方案就订好了。抢红包的时候,不过是挨个pop up而已。


因此 python 代码如下:

def weixin_divide_hongbao(money, n): 
divide_table = [random.randint(1, 10000)
for x in xrange(0, n)] 
sum_ = sum(divide_table) 
return [x*money/sum_ for x in divide_table]

不过上述算法还有两个小问题:

1.浮点数精度问题


2.边界值的处理

第三位同学按照网上流传的python写了一个java的版本

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i

第四位同学的这种算法看起来非常科学。


他认为:


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 j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i

输入一看,波动太大,这数据太无趣了!


第1个红包:7.48 元,余额:2.52 元


第2个红包:1.9 元,余额:0.62 元


第3个红包:0.49 元,余额:0.13 元


第4个红包:0.04 元,余额:0.09 元


第5个红包:0.03 元,余额:0.06 元


第6个红包:0.03 元,余额:0.03 元


第7个红包:0.01 元,余额:0.02 元


第8个红包:0.02 元,余额:0 元


改良一下,将平均值作为随机安全上限来控制波动差


int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i

输出结果见下图

第1个红包:0.06 元,余额:9.94 元


第2个红包:1.55 元,余额:8.39 元


第3个红包:0.25 元,余额:8.14 元


第4个红包:0.98 元,余额:7.16 元


第5个红包:1.88 元,余额:5.28 元

第6个红包:1.92 元,余额:3.36 元


第7个红包:2.98 元,余额:0.38 元


第8个红包:0.38 元,余额:0 元


“如何理解随机算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


网站题目:如何理解随机算法-创新互联
浏览路径:http://pwwzsj.com/article/cossos.html