专栏名称: Android博客周刊
[ Android Blog 周刊 ]每周一准时更新,主要包括本周最新的优秀国内外博客,新闻,类库,视频等 [www.androidblog.cn ] [ QQ群:149581646 ]
目录
相关文章推荐
郭霖  ·  Android Surface截图方法总结 ·  4 天前  
郭霖  ·  StateFlow 和 ... ·  1 周前  
郭霖  ·  Android ... ·  1 周前  
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期    |    12期    |    11期    |    10期    |    09期    |    08期    |    07期

06期    |    05期    |    04期    |    03期    |    02期    |    01期    |



-----------------------------------------------------------------------------------------

自动回复:

公众号已做了自动聊天回复功能,大家可以用以下关键词进行挑逗。

网站QQ群代言人福利1-47(最新期数)之间任意数字最新文章 等!


温馨提示:

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

或点击文章末尾"阅读全文"里进行查看