【算法】Fisher-Yates 洗牌算法

Fisher-Yates 洗牌算法代码如下:

const cpData = ['a', 'b', 'c', 'd']
for (var i = cpData.length - 1; i > 0; i--) {
	var j = Math.floor(Math.random() * (i + 1));
	var temp = cpData[i];
	cpData[i] = cpData[j];
	cpData[j] = temp;
}

对于代码的解释

Math.random() * (i + 1) 是一个生成0到1之间的随机数乘以 (i + 1) 的表达式。

在 Fisher-Yates 洗牌算法中,这个表达式用于生成一个介于 0(包含)和 (i + 1)(不包含)之间的随机数。其中 i 是当前迭代的索引值,它表示从数组的最后一个元素到当前迭代的元素的范围。

通过将 (i + 1) 作为乘数,我们可以确保生成的随机数逐渐减小,从而在算法中正确地选择要交换的元素位置。

需要注意的是,Math.random() 方法返回一个介于 0(包含)和 1(不包含)之间的伪随机小数。

在 Fisher-Yates 洗牌算法的每个迭代中,我们使用 Math.random() * (i + 1) 生成一个随机数,并将其向下取整(Math.floor())得到一个介于 0 和 i(包含)之间的随机整数。这个随机整数表示要与当前元素交换的位置。

你可能感兴趣的:(算法,算法)