Fisher–Yates shuffle洗牌算法

最近需要做一个小游戏,游戏的第一个需求就是要实现一个算法:随机打乱一个数组,也可以称之为洗牌。

现实生活中,洗牌的方式有多种。但对应到计算机实现当中,比较好的一种当属抽牌----不停的从剩下的扑克当中抽取一个,直到抽取的牌组成一副新的扑克为止。这也就是经典的洗牌算法Fisher–Yates shuffle的思路。

简单讲洗牌算法(Fisher–Yates shuffle)是用来将一个有限集合打乱的算法。这个算法生成的随机排列是等概率的,同时需要非常高效。

形象的用图来表示抽牌迭代的过程如下:

随机数取值范围 随机数 原始数据 结果
1 2 3 4 5 6 7 8
0-7 1 1 8 3 4 5 6 7 2
0-6 4 1 8 3 4 7 6 5 2
0-5 5 1 8 3 4 7 6 5 2
0-4 4 1 8 3 4 7 6 5 2
0-3 1 1 4 3 8 7 6 5 2
0-2 0 3 4 1 8 7 6 5 2
0-1 0 4 3 1 8 7 6 5 2
0-0 0 4 3 1 8 7 6 5 2

Kotlin实现如下:

fun Array<Int>.shuffle(){
    for (i in this.size -1 downTo 0){
        var random = Math.floor( Math.random() * (i + 1)).toInt()
        var temp =  this[random]
        this[random] = this[i]
        this[i] = temp
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如果你想跟朋友一起玩德州扑克的话,你应该先洗牌,以随机的牌序来确保一个公平的游戏。但是怎么做呢? 有一个简单而有效...
    mervynyang阅读 4,183评论 1 6
  • 大家好,我是IT修真院武汉分院第11期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网js任务...
    斌仔_83e7阅读 2,799评论 0 2
  • 大家好,我是IT修真院深圳分院第02期学员,一枚正直善良的web程序员。 今天给大家分享一下,修真院官网JS任务0...
    与其感慨路难行阅读 1,079评论 0 4
  • Python random包可以用来生成随机数。随机数不仅可以用于数学用途,还经常被嵌入到算法中,用以提高算法效率...
    达闻西阅读 4,313评论 1 2
  • 第一次见你 未曾动情 更多的 是路人般的平静 以为自己不会动心 原来我的爱情 靠感觉 而我的感觉 原来是你 以为...
    言梁阅读 288评论 2 7

友情链接更多精彩内容