Array.prototype.Random,随机对Array进行排序的脚本。。

Lostinet 2002-11-12 09:45:40
以前也写过的。
不过那时不太懂Array.prototype.sort的使用。
所以那时的结果有问题。
现在这个是经过测试的。
并且排序和Array内的元素无关。

<script>
function Array.prototype.Random()
{
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 d1=new Date();

var c=40;
var arr=new Array();
var a=[];
for(var i=0;i<c;i++)
{
arr[i]=i+.5;
a[i]=0;
}
for(var j=0;j<1000;j++)
{
var arr2=arr.Random()
for(var i=0;i<c;i++)
a[i]+=arr2[i];
}

var d2=new Date();

alert([
a,"\n","Millisecnods",d2-d1
]);
</script>
...全文
39 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
a-b对于字符串不合适.

Random1的方法很好。应该是秋水写的吧??

emu 2002-11-12
  • 打赏
  • 举报
回复
比较一下各种方法的性能:

function Array.prototype.Random0()
{
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是谁写的?
emu 2002-11-12
  • 打赏
  • 举报
回复
return a>b?1:a<b?-1:0 按秋水的写法就是:return a-b 呵呵
emu 2002-11-12
  • 打赏
  • 举报
回复

return this.concat().sort(function(){return Math.random()-.5}).sort(function(){return Math.random()-.5})

这样慢一点但是结果合理一点。

其实sort都是改变原数组的,我认为random改变原数组也挺合理的。
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
这个SortBy对于ASP也是有用的。。
经常就是取下来数据Array。
然后需要排序。
而排序的规则是另外一个数据Array
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
其实那段原思路,写成这样还好:

function Array.prototype.SortBy(arrSort,funcSort)
{
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)
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
emu:
我的和你的不止在随机的情况不同。连行为也有差别哦。
对于
arr2=arr1.Random()
我的是不改变arr1的内部的。
而你的会。

你的方法写成我的行为,可以先复制一份。

function Array.prototype.Random()
{
return this.concat().sort(function(){return Math.random()-.5})
}

对于这种不太完全随机的,还是有其用处的。例如只是想简单地打打乱。
调整.5的大小,可以起不同的效果。

emu 2002-11-12
  • 打赏
  • 举报
回复
prototype是原型方法,为已经存在的类增添新的方法
为了又偷懒又随机,我又写了第二个方法:

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)

这回的结果好多了,不够速度就更慢了呵呵
flashsoft2000 2002-11-12
  • 打赏
  • 举报
回复
我对这句的理解可能不够
可以解释下么
Array.prototype.Random
这个是定义一个Random的函数方法出来么?
里面的倒是消化了
^_^

emu 2002-11-12
  • 打赏
  • 举报
回复
我的写法不是真正的随机的,主要是偷懒,其实Lostinet的写法结果合理一点。
flashsoft2000 2002-11-12
  • 打赏
  • 举报
回复
好写法
emu 2002-11-12
  • 打赏
  • 举报
回复
function Array.prototype.Random() {this.sort(new Function("return Math.random()-.5"))}

var ar=[0,1,2,3,4,5,6,7,8,9]
ar.Random()
alert(ar)
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
//这样:?

function Array.prototype.Random()
{
//取长度
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;
}

Go_Rush 2002-11-12
  • 打赏
  • 举报
回复
什么和什么,注释太少,看起来头大
Lostinet 2002-11-12
  • 打赏
  • 举报
回复
这个是原思路:


//返回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;
}
emu 2002-11-12
  • 打赏
  • 举报
回复
好眼光!是秋水。

a-b如果里面是表示数字的串会自动类型转换。

87,975

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧