专栏名称: Android博客周刊
[ Android Blog 周刊 ]每周一准时更新,主要包括本周最新的优秀国内外博客,新闻,类库,视频等 [www.androidblog.cn ] [ QQ群:149581646 ]
目录
相关文章推荐
开发者全社区  ·  航空公司门口惊现小纸条 ·  10 小时前  
开发者全社区  ·  Top2本硕:一把好牌打的稀烂 ·  15 小时前  
开发者全社区  ·  当初和你结婚,对你的定位是P7 ·  15 小时前  
开发者全社区  ·  中年男人「失去性欲」的标志 ·  昨天  
开发者全社区  ·  一顿饭42w ·  2 天前  
51好读  ›  专栏  ›  Android博客周刊

随机洗牌算法

Android博客周刊  · 公众号  · android  · 2016-12-25 15:56

正文

温馨提示:

微信公众号做了超链接限制,有兴趣的小伙伴可以直接到

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期 |







请到「今天看啥」查看全文