js把数组产生无序随机数组
/**//*
功能:把有序数组打乱(产生无序随机数组)
说明:基本的排序算法大家应该都很清楚。但是在编程中也经常用到相反的操作,即把原来有序的数组元素随机打乱。
以下给出三种方法,第一种是以前我自己写出来的,由于水平差,写出的代码时间复杂度太大,
于是从网上搜索一些简单而且效率高的方法来。
第二种据说是“洗牌算法”,想必很多人都听说过;
第三种是利用JS的内置sort方法,这种实现起来很简单。
*/
代码如下 | |
// 方法1(给大家做失败的教训借鉴) function randArray(num) { var rands = []; var ra = parseInt(num * Math.random()); rands.push(ra); for (var r = 0; r < num - 1; r++) { ra = parseInt(num * Math.random()); for (var m = 0; m < rands.length; m++) { while (rands[m] == ra) { ra = parseInt(num * Math.random()); m = -1; } } rands.push(ra); } //alert(rands); return rands; } |
// 方法2:
//选择两个[0...array.Length)之间的随机数,把它们做下标的两个元素交换位置(这样乱序效率高)
/* 说明:这是“洗牌算法” 有人证明打乱的效果如下:
随机交换nums/2次的效果很差,平均约1/3的对象还在原来的位置
随机交换nums次才基本可用,平均约15%的对象还在原来的位置
随机交换nums*2次才真正可用,平均约2%的对象还在原来的位置
*/
代码如下 | |
function daluan(nums) { var array=[]; for (var i = 0; i < nums; i++) { array[i] = i; } for (var i = 0; i < nums; i++) { var rand = parseInt(nums * Math.random()); var temp = array[i]; array[i] = array[rand]; array[rand] = temp; } return array; } |
// 方法3:
// 让比较函数随机传回-1或1就可以了(这样乱序效率可能不高)
代码如下 | |
var testArray3=[1,2,3,4,5,6,7,8,9,10,22,33,55,77,88,99]; testArray3.sort(function(){return Math.random()>0.5?-1:1;}); alert(testArray3); |