本帖最后由 xinyu126 于 2012-9-20 10:35 编辑
看了首页的帖子。 连接:http://bbs.9ria.com/thread-149910-1-1.html
发现帖子内容和我的已知相差很远。不得不写了一个测试,用事实来证明什么是真正高效率随机数组。
不管是as还是别的语言。这种方式都是最高效的。
看代码 package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getTimer;
public class uilib extends Sprite
{
public function uilib()
{
test(null);
}
private function test(evt:Event):void{
var len:int = 100000;
var arr:Array = new Array(len);
for(var i:int = 0; i<len;i++){
arr[i] = i;
}
var start:int;
var end:int;
start = getTimer();
arr = func1(arr);
end = getTimer();
trace('func1=>',end-start);
start = getTimer();
arr = func2(arr);
end = getTimer();
trace('func2=>',end-start);
start = getTimer();
arr = func3(arr);
end = getTimer();
trace('func3=>',end-start);
start = getTimer();
arr = func4(arr);
end = getTimer();
trace('func4=>',end-start);
start = getTimer();
arr = func5(arr);
end = getTimer();
trace('func5=>',end-start);
}
private function func1(rawArr:Array):Array{
rawArr.sort(function():Number{ return Math.random()-0.5>0?1:-1; });
return rawArr;
}
private function func2(array:Array):Array
{
var newArray:Array = new Array();
while (array.length > 0)
{
newArray.push(array.splice(Math.floor(Math.random()*array.length), 1));
}
return newArray;
}
private function func3(myArray:Array):Array
{
for (var i:uint = 0; i < myArray.length; i++)
{
var rand:uint = int(Math.random() * myArray.length);
myArray.push( myArray.splice( rand, 1 )[0] );
}
return myArray;
}
private function func4(myArr:Array):Array{
var rnd:int;
var tmp:*;
for(var i:uint = 0;i<myArr.length;i++){
tmp = myArr[i];
rnd = Math.random()*myArr.length;
myArr[i] = myArr[rnd];
myArr[rnd] = tmp;
}
return myArr;
}
private function func5(myArr:Array):Array{
var rnd:int;
var tmp:*;
var len:int = myArr.length;
for(var i:uint = 0;i<len;i++){
tmp = myArr[i];
rnd = Math.random()*len;
myArr[i] = myArr[rnd];
myArr[rnd] = tmp;
}
return myArr;
}
}
} 看运行结果:
func1=> 568
func2=> 4740
func3=> 9412
func4=> 53
func5=> 44
数组的所有操作下标操作是最快的。这也是数组的最基本的结构了。其他的操作都是对索引的高级处理。除了pop和push,其他都很耗时间。 所以方法4比2,3快。 方法1是个例外,之前我判断失误。原本以为1会很慢,因为他还有函数调用。后来一想,人家内部就是一个循环,并且也是交换而已。肯定不能比2,3慢。 方法5是方法4的优化。所谓优化就是不要在循环里面去array的长度而已。所以for循环的时候用i--会比i++快。 |