网上查到一个方法(这个方法效率不高,不贴出代码了): 基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。于是按自己想法写了,加上多次改进(勉强达要求):function ran_Arr_2(oArr) {
var arrNum = [];
var tArr = [];//新数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
arrNum.push(random_x);//压进位置
for(var j=0;j<arrNum.length-1;j++) {
if( random_x >= arrNum[j])
random_x++;
}
tArr.push(oArr[random_x]); //压进数组
}
return tArr; //返回新数组
}function ran_Arr_3(oArr) {
var oArr_copy = oArr.slice(0);//复制原数组
var tArr = [];//新数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
tArr.push(oArr_copy[random_x]); //压进数组
oArr_copy[random_x] = oArr_copy[i-1];
}
return tArr; //返回新数组
}function ran_Arr_4(oArr) {
var temp_x; //临时交换数
var tArr = oArr.slice(0);//新数组,复制原数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
temp_x = tArr[random_x];
tArr[random_x] = tArr[i-1];
tArr[i-1] = temp_x;
}
return tArr; //返回新数组
}
现求更有效率的代码:
变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。于是按自己想法写了,加上多次改进(勉强达要求):function ran_Arr_2(oArr) {
var arrNum = [];
var tArr = [];//新数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
arrNum.push(random_x);//压进位置
for(var j=0;j<arrNum.length-1;j++) {
if( random_x >= arrNum[j])
random_x++;
}
tArr.push(oArr[random_x]); //压进数组
}
return tArr; //返回新数组
}function ran_Arr_3(oArr) {
var oArr_copy = oArr.slice(0);//复制原数组
var tArr = [];//新数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
tArr.push(oArr_copy[random_x]); //压进数组
oArr_copy[random_x] = oArr_copy[i-1];
}
return tArr; //返回新数组
}function ran_Arr_4(oArr) {
var temp_x; //临时交换数
var tArr = oArr.slice(0);//新数组,复制原数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
temp_x = tArr[random_x];
tArr[random_x] = tArr[i-1];
tArr[i-1] = temp_x;
}
return tArr; //返回新数组
}
现求更有效率的代码:
var a = [1, 2, 3, 4, 5, 6,7];
var b = [2, 6,10];
var isok = true;
while (true) {
isok = true;
var lena = a.length;
var lenb = b.length;
if (lenb >= lena) {
break;
}
var rand = Math.round(Math.random() * (lena-1));
for (var i = 0; i < lenb; i++) {
if (b[i] == a[rand]) {
isok = false;
break;
}
}
if (isok == true) {
b.push(a[rand]);
}
}
document.getElementById("div1").innerHTML =b.valueOf();不知道是不是你要的。
var arr2 = [4,6];
function addSome(arr1,arr2){
if(arr1==null||arr1.length==0) return [];
if(arr2==null||arr2.length==0) return arr1;
var length = arr2.length;
var obj = new Object();
for(var i=0; i<length; i++){
eval("obj.pop" + arr2[i] + "='" + arr2[i] + "';");
}
var l = arr1.length;
for(var i=0;i<l;i++) {
if(eval("typeof obj.pop" + arr1[i] + "=='undefined'")){
arr2.push(arr1[i]);
}
if(arr2.length==l){
break;
}
}
return arr2.sort(); //如果要排序的话,再加上sort
}
var t = addSome(arr1,arr2);
alert(t);
<script language="javascript">
Array.prototype.unique2 = function(){
for(var a={}, b={}, i=0, n=this.length; i<n; i++){
if(typeof(b[this[i]])!="undefined") continue;
if(typeof(a[this[i]])=="undefined") a[this[i]] = 1;
else{ b[this[i]]=1; delete a[this[i]] }
}
this.length=0;
for(i in a) this[this.length] = i; return this;
}; var a1 = new Array(1,2,3,4,5,6,7,8,9);
var a2 = new Array(2,3,4,5,6,7);
var c = a1.concat(a2).unique2();var d = a2.concat(c).unique2();
alert(d);//你要的结果
//至于d数组不能超过a1数组的长度,自己做下处理好了
</script>
function ran_Arr_3(oArr) {
var tArr = [];//新数组
//..................
//..................
//.................. return tArr; //返回新数组
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JS 数组 随机自动排序</title>
<script type="text/javascript">
<!--
var oArrays = [];
for (var j=0;j<1000000;j++) {
oArrays.push( j + "");
} //var oArrays = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100"]; //
function ran_Arr(oArr) {
var temp_x; //临时交换数
var tArr = oArr.slice(0);//新数组,复制原数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
temp_x = tArr[random_x];
tArr[random_x] = tArr[i-1];
tArr[i-1] = temp_x;
}
return tArr; //返回新数组
}
function show_Arr()
{
var d1s= (new Date()).getTime();
var oArr = ran_Arr(oArrays);
var d2s= (new Date()).getTime();
document.getElementById("showTime").innerHTML = d2s-d1s;
var ss="";
for (var j=0;j<oArr.length;j++) {
ss += j + ". " + oArrays[j] + " - " + oArr[j] + "<br/>";
}
//document.getElementById("showResult").innerHTML = ss;
}
window.onload = function() {
show_Arr();
document.getElementById("showNew").onclick = function() {show_Arr();};
}
//-->
</script>
<style type="text/css">
<!--
body {margin:0; padding:0;}
p {text-align:center; background:#EEE; padding:20px 0; margin: 0;}
span {width: 780px; word-break:break-all}
input {width:100px; height:30px}
-->
</style>
</head>
<body>
<p>
<span id="showTime"> </span><br />
<input id="showNew" name="showNew" type="button" value="生成新顺序" />
<br /><br />
<span id="showResult"> </span>
</p>
</body>
</html>
alert(a.sort(function(){
return 0.5 > Math.random();
}));
最简单的随机排序了
var tArr = oArr.slice(0);//新数组,复制原数组
var random_x;
tArr.sort(function(){ return 0.5 > Math.random(); });
return tArr; //返回新数组
}
function ran_Arr(oArr) {
var temp_x; //临时交换数
var tArr = oArr.slice(0);//新数组,复制原数组
var random_x;
for(var i=oArr.length;i>0;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
temp_x = tArr[random_x];
tArr[random_x] = tArr[i-1];
tArr[i-1] = temp_x;
}
return tArr; //返回新数组
}
ran_Arr 1 54.29% 2675.891ms 2675.891ms 2675.891ms 2675.891ms 2675.891msrenderArr 1 45.7% 2252.419ms 2252.419ms 2252.419ms 2252.419ms 2252.419ms function renderArr(arr){
var _arr = arr;
var temp,random;
var length = arr.length;
while(length){
random = Math.floor(Math.random()*length);
temp = _arr[random];
length--;
_arr[random] = _arr[length];_arr[length] = temp;
}
return _arr;
}
你的代码结构和我的完全一样啊,效率也一样,
你的函数的快那么一点的原因我也找到了
var tArr = oArr.slice(0);//新数组,复制原数组
你没有复制原数组,所以快那么一点。
var _arr = arr;
JS的性能在高,相对服务器来讲还是很低
var arr = [1,2,3,4,5,6,7,8,9];var len = arr.length;
while(len--){
var k = Math.round(Math.random()*len)
arr[len] = [arr[k],arr[k]=arr[len]][0]
}
alert(arr);
</script>
function ran_Arr(oArr) {
var temp_x; //临时交换数
var tArr = oArr.slice(0);//新数组,复制原数组
for(var i = tArr.length++,random_x;i>1;i--) {
random_x = Math.floor(Math.random()*i); // 取得一个随机数
tArr[i] = tArr[random_x];
tArr[random_x] = tArr[i-1];
}
return tArr.splice(1,1); //返回新数组
}