需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。
先来生成一个有序的数组:
1 |
var arr = [], |
2 |
length = 100, |
3 |
i = 0; |
4 |
5 |
for ( ; i < length; i++ ){ |
6 |
arr.push( i ); |
7 |
} |
从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复。
01 |
var gRandomArr = function( arr, length ){ |
02 |
var newArr = [], |
03 |
i = 0, |
04 |
index; |
05 |
06 |
for ( ; i < length; i++ ){ |
07 |
// 利用数组长度生成随机索引值 |
08 |
index = parseInt( Math.random() * arr.length ); |
09 |
// 将随机索引对应的数组元素添加到新的数组中 |
10 |
newArr.push( arr[index] ); |
11 |
// 删除原数组中随机生成的元素 |
12 |
arr.splice( index, 1 ); |
13 |
} |
14 |
15 |
return newArr; |
16 |
}; |
17 |
18 |
// 调用 |
19 |
gRandomArr( arr, 10 ); |
方法1主要是采用基于数组本身的长度去生成随机的索引值,然后将索引值对应的数组元素添加到随机数组中,由于不能有重复,在添加好后将删除原数组的元素。
01 |
var gRandomArr = function( arr, length ){ |
02 |
// 使用sort将原数组的顺序打乱,让有序变成无序 |
03 |
arr.sort(function(){ |
04 |
return Math.random() - 0.5; |
05 |
}); |
06 |
07 |
// 从原数组中一次性返回10个元素 |
08 |
return arr.slice( 0, length ); |
09 |
}; |
10 |
11 |
// 调用 |
12 |
gRandomArr( arr, 10 ); |
方法2采用的办法是先打乱原数组的顺序,但这里需要用到 sort 来对原数组进行排序,如果数组长度较大的话,sort 排序的性能损耗会更大,因为需要遍历整个数组,而随机抽取的话,不需要对整个数组进行遍历,故其性能会更好。
JavaScript算法题之–随机数的生成,布布扣,bubuko.com
原文:http://www.cnblogs.com/lmy-ms/p/3863649.html