【算法】Fisher-Yates 洗牌算法

该文章详细介绍了Fisher-Yates洗牌算法的实现过程,通过JavaScript代码展示了如何对数组进行随机排列。关键在于使用Math.random()生成随机索引,并与当前元素交换,确保了数组元素的随机分布。
摘要由CSDN通过智能技术生成

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(包含)之间的随机整数。这个随机整数表示要与当前元素交换的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值