转:http://blog.sina.com.cn/s/blog_59fc399801015uiy.html
把一个数组随机打乱,可以看做顺序排序的逆运算,顺序排序算法很多,随机排序也不少,下面列举个人觉得最好的三种。(感谢9ria论坛的朋友提供思路)
算法列表: 1.自身插入法
private function randomArr(arr:Array):Array
{
var outputArr:Array = arr.slice();
var i:int = outputArr.length;
while (i)
{
outputArr.push(outputArr.splice(int(Math.random() * i--), 1)[0]);
}
return outputArr;
}
2.传统插入法
private function randomArr(arr:Array):Array
{
var cloneArr:Array = arr.slice();
var outputArr:Array = [];
var i:int = cloneArr.length;
while (i)
{
outputArr.push(cloneArr.splice(int(Math.random() * i--), 1)[0]);
}
return outputArr;
}
在数组较长(200以上)时效率比自身插入法高,因为短数组操作起来更快。
3.选择法
private function randomArr(arr:Array):Array
{
var outputArr:Array = arr.slice();
var i:int = outputArr.length;
var temp:*;
var indexA:int;
var indexB:int;
while (i)
{
indexA = i-1;
indexB = Math.floor(Math.random() * i);
i--;
if (indexA == indexB) continue;
temp = outputArr[indexA];
outputArr[indexA] = outputArr[indexB];
outputArr[indexB] = temp;
}
return outputArr;
}
效率比较: 利用1-100的顺序数组进行测试,执行10000次所用的时间分别为。 自身插入法:1654 传统插入法: 2574 选择法: 594
注意:利用sort()实现随机算法得到的结果并不能保证概率平均,不建议使用。
结论: 选择法>传统插入法(通用性好)>自身插入法
结论: 选择法>传统插入法(通用性好)>自身插入法