温馨提示:
微信公众号做了超链接限制,有兴趣的小伙伴可以直接到
www.androidblog.cn
或点击文章末尾"
阅读全文
"里进行查看
注意 【招编辑和分享讲师,有意者公众号留言】
作者简介:
本文作者
A闪
本文原地址:
http://www.ashan.org/archives/925
文章源自网络,如果涉及侵权等问题,请第一时间联系我们予以下架
jingle bells, jingle bells, jingle all the way!
今天是圣诞节,开篇先祝各位节日快乐,单身狗都脱单,节日也不要忘了学习一下,希望各位受用,
文中有关于圣诞老人的问题,知道的请留言,前三名有红包
哦!文末不要忘了打赏或留言哦~
最近和同事讨论棋牌类游戏中的一些算法技巧和网络通信技巧,说到抽牌算法。如何每次洗牌更加平均,这是一个比较容易出问题的地方。我们有非常多的算法可以使用,算非常容易想到,使用一个随机数即可。但当你做千次以及上万次测试时会发现,概率并非平均分布,游戏数字出现几率非常高,而一些数字出现几率很低。如何解决这个问题。网上搜了一下,还真有不少方法,一些高级方法基于概率学,但通常情况下速度不理想。最终发现一个名为“Fisher–Yates”的算法,大概介绍如下:
Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销。
算法的过程如下:
需要随机置乱的n个元素的数组a
从0到n开始循环,循环变量为i
生成随机数K,K为0到n之间的随机数
交换i位和K位的值
使用JavaScript代码实现如下:
运行结果:
看上去还可以,顺序被打乱了,我们来连续执行1000次,看一下各个数值的分布情况。
列代表对应位出现的次数,行代码数字。
我们可以看到,数组中一共10个数字,共执行1000次,如平均分布的话,出现次数为100次,根据表中的最大值计算,误差为20%左右。结果相对比较理想。我们再来做10000次运算测试。
10000次平均值应为1000,结果中误差为5%左右。圣诞老人送出的第一份礼物是什么,当我们在服务器中进行大量随机元算时,此方法相对比较理想。
最后贴一下测试用例代码:
关于Fisher-Yates算法,可以参考这里
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
------------------------------ End ------------
--------------------
精选文章:
View事件体系
面试遇到的那些坑
Android密钥保护和C/S网络传输安全理论指南
往期周刊:
46期
|
45期
|
44期
|
43期
|
42期
|
41期
|
40期
|
39期
38期
|
37期
|
36期
|
35期
|
34期
|
33期
|
32期
|
31期
30期
|
29期
|
28期
|
27期
|
26期
|
25期
|
24期
|
23期
22期
|
21期
|
20期
|
19期
|
18期
|
17期
|
16期
|
15期
14期
|
13期
|