这个是原思路:
//返回arrSrc排序后的结果,但是排序的依据是arrSort
//两个Array的长度必须要相等
//funcSort(arrSortItemA,arrSortItemB)为可选项。
function SortArrayByAnother(arrSrc,arrSort,funcSort)
{
var len=arrSort.length;
if(arrSrc.length!=len)throw(new Error(-1,"SortArrayByAnother:length("+arrSrc.length+")!=length("+arrSort.length+")")); var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]={i:i,r:arrSort[i]};
funcSort=funcSort||function(a,b){return a>b?1:a<b?-1:0};
arr.sort(function(A,B){
return funcSort(A.r,B.r);
});
var arr2=new Array(len);
for(var i=0;i<len;i++)
arr2[i]=arrSrc[arr[i].i];
return arr2;
}
function Array.prototype.Random()
{
var len=this.length;
var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]=Math.random();
return SortArrayByAnother(this,arr);
}
function Array.prototype.Random1()
{
var len=this.length;
var arrt=new Array(len);
for(var i=0;i<len;i++)
arrt[i]={i:i,r:Math.random()};
arrt.sort(function(a,b){return a.r>b.r?1:a.r<b.r?-1:0});
var arrr=new Array(len);
for(var i=0;i<len;i++)
arrr[i]=this[arrt[i].i];
return arrr;
}
//返回arrSrc排序后的结果,但是排序的依据是arrSort
//两个Array的长度必须要相等
//funcSort(arrSortItemA,arrSortItemB)为可选项。
function SortArrayByAnother(arrSrc,arrSort,funcSort)
{
var len=arrSort.length;
if(arrSrc.length!=len)throw(new Error(-1,"SortArrayByAnother:length("+arrSrc.length+")!=length("+arrSort.length+")")); var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]={i:i,r:arrSort[i]};
funcSort=funcSort||function(a,b){return a>b?1:a<b?-1:0};
arr.sort(function(A,B){
return funcSort(A.r,B.r);
});
var arr2=new Array(len);
for(var i=0;i<len;i++)
arr2[i]=arrSrc[arr[i].i];
return arr2;
}
function Array.prototype.Random()
{
var len=this.length;
var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]=Math.random();
return SortArrayByAnother(this,arr);
}
function Array.prototype.Random1()
{
var len=this.length;
var arrt=new Array(len);
for(var i=0;i<len;i++)
arrt[i]={i:i,r:Math.random()};
arrt.sort(function(a,b){return a.r>b.r?1:a.r<b.r?-1:0});
var arrr=new Array(len);
for(var i=0;i<len;i++)
arrr[i]=this[arrt[i].i];
return arrr;
}
{
//取长度
var len=this.length; //创建一个Array,其中的元素是一个Object,属性i是其初始index,属性r是一个随机数
var arrt=new Array(len);
for(var i=0;i<len;i++)
arrt[i]={i:i,r:Math.random()}; //根据Object中的r进行排序,r为随机,那样i的位置会打乱.结果保存回arrt自身
arrt.sort(function(a,b){return a.r>b.r?1:a.r<b.r?-1:0}); //创建结果
var arrr=new Array(len); //根据Object中的i来把this的元素复制到arrr中。
for(var i=0;i<len;i++)
arrr[i]=this[arrt[i].i]; //返回打乱了的结果。
return arrr;
}
ar.Random()
alert(ar)
可以解释下么
Array.prototype.Random
这个是定义一个Random的函数方法出来么?
里面的倒是消化了
^_^
为了又偷懒又随机,我又写了第二个方法:function Array.prototype.Random() {this.sort(new Function("return Math.random()-.5"))}
function Array.prototype.Random2() {this.Random();this.Random()}var ar=[0,1,2,3,4,5,6,7,8,9]
ar.Random2()
alert(ar)这回的结果好多了,不够速度就更慢了呵呵
我的和你的不止在随机的情况不同。连行为也有差别哦。
对于
arr2=arr1.Random()
我的是不改变arr1的内部的。
而你的会。你的方法写成我的行为,可以先复制一份。function Array.prototype.Random()
{
return this.concat().sort(function(){return Math.random()-.5})
}对于这种不太完全随机的,还是有其用处的。例如只是想简单地打打乱。
调整.5的大小,可以起不同的效果。
{
var len=arrSort.length;
if(this.length!=len)throw(new Error(-1,"SortArrayByAnother:length("+arrSrc.length+")!=length("+arrSort.length+")")); var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]={i:i,r:arrSort[i]};
funcSort=funcSort||function(a,b){return a>b?1:a<b?-1:0};
arr.sort(function(A,B){
return funcSort(A.r,B.r);
});
var arr2=new Array(len);
for(var i=0;i<len;i++)
arr2[i]=this[arr[i].i];
return arr2;
}
function Array.prototype.Random()
{
var len=this.length;
var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]=Math.random();
return this.SortBy(arr);
}
不过这个版本的Random性能当然会差很多(速度大约是顶楼的1/2)
经常就是取下来数据Array。
然后需要排序。
而排序的规则是另外一个数据Array
return this.concat().sort(function(){return Math.random()-.5}).sort(function(){return Math.random()-.5})这样慢一点但是结果合理一点。其实sort都是改变原数组的,我认为random改变原数组也挺合理的。
{
this.sort(function(){return Math.random()-.5})
}function Array.prototype.Random1() {
for(var i=0;i<this.length;i++){
var rnd=Math.floor(Math.random()*this.length)
var swap=this[i];this[i]=this[rnd];this[rnd]=swap
}
}function Array.prototype.Random2()
{
this.sort(function(){return Math.random()-.5});this.sort(function(){return Math.random()-.5})
}var ar=[0,1,2,3,4,5,6,7,8,9]
var d0=new Date()
for (var i=0;i<1000;i++) ar.Random0();
var d1=new Date()
for (var i=0;i<1000;i++) ar.Random1();
var d2=new Date()
for (var i=0;i<1000;i++) ar.Random2();
var d3=new Date()alert((d1-d0)+"\n"+(d2-d1)+"\n"+(d3-d2))猜猜Random1是谁写的?