温馨提示:
微信公众号做了超链接限制,有兴趣的小伙伴可以直接到
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
或点击文章末尾"阅读全文"里进行查看