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.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
    }
}

你可能感兴趣的:(Fisher–Yates shuffle洗牌算法)