2025年公平洗牌算法_随机洗牌算法

公平洗牌算法_随机洗牌算法要求 给定一个长度为 n 的有序数组 要求将其完全打乱 每个素在任何位置出现的概率均为 1 n 随机洗牌算法有好几个 这里讲其中的一个 Fisher Yates shuffle 算法 时间复杂度为 O n 其思路如下 1 从数组中随机选取一个数 p 2 将 p 与数组中最后 也可以是最前 的素交换 如果随机选中的是最后的素 则相当于没有发生交换 3 去掉最后的素 这里并没有删除操作

要求:给定一个长度为n的有序数组,要求将其完全打乱,每个素在任何位置出现的概率均为1/n。

随机洗牌算法有好几个,这里讲其中的一个,Fisher-Yates shuffle算法(时间复杂度为O(n)),其思路如下:

(1)从数组中随机选取一个数p。

(2)将p与数组中最后(也可以是最前)的素交换。(如果随机选中的是最后的素,则相当于没有发生交换)

(3)去掉最后的素(这里并没有删除操作,而是缩小索引值范围),即选中的p,缩小选取的数组范围。

(4)重复步骤(1)~(3),直到数组的长度为1时结束。

代码如下:

function shuffle(arr){
var tmp;
var len=arr.length;
if(len<=1){return arr;}
for(var i=len-1;i>0;i--){
var ind=Math.round(Math.random()*i); //随即产生0到i之间的一个数并将其四舍五入成一个整数,作为随机选中的素的下标
tmp=arr[i];
arr[i]=arr[ind];
arr[ind]=tmp; //随机数与最后一个素进行交换
}
return arr;
}










测试:

今天的文章 2025年公平洗牌算法_随机洗牌算法分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-07-05 18:51
下一篇 2025-08-02 20:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/137177.html