从 1000 个元素的数组中获取 50 个随机唯一元素的最简单方法是什么?
text = new Array();
for(i=0;i<1000;i++){ text[i]=i; } //array populated
// now I need to get 50 random unique elements from this array.
从 1000 个元素的数组中获取 50 个随机唯一元素的最简单方法是什么?
text = new Array();
for(i=0;i<1000;i++){ text[i]=i; } //array populated
// now I need to get 50 random unique elements from this array.
本主题中解释了好的算法(在 C 中,但您可以在 JS 中轻松地做同样的事情)
这假设您的意思是随机索引而不是具有唯一值的索引。
一种方法是复制数组并删除您使用的数组:
function getRandomIndexes( arr, cnt){
var randomArr = [],
arrCopy = arr.slice(),
i,
randomNum ;
for (i=0;i<arrCopy.length;i++) {
randomNum = Math.floor( arrCopy.length * Math.random());
randomArr = randomArr.concat( arrCopy.splice(randomNum ,1) );
}
return randomArr;
}
var myNums = [], i, randSet;
for (i=0;i<10;i++){
myNums.push(i);
}
randSet = getRandomIndexes(myNums, 5);
另一种方法是跟踪您使用的索引并继续查找,直到找到您未使用的索引。我发现 while 循环很可怕,如果随机索引需要接近数组长度,我个人不会使用此解决方案。
function getRandomIndexes( arr, cnt){
var randomArr = [],
usedNums = {},
x;
while (randomArr.length<cnt) {
while (usedNums[x]===true || x===undefined) {
x = Math.floor( Math.random() * arr.length);
}
usedNums[x] = true;
randomArr.push( arr[x] );
}
return randomArr;
}
var myNums = [], i, randSet;
for (i=0;i<10;i++){
myNums.push(i);
}
randSet = getRandomIndexes(myNums, 5);
研究Fisher-Yates 算法,我认为这对你有用。
var arr = [];
while(arr.length < 51){
var ind = Math.floor(Math.random()*1000);
if(!(ind in arr))
arr.push(ind)
}
您将在数组 arr 中有 50 个随机唯一数字,您可以将其用作索引
编辑:
正如@ajax333221 提到的,前面的代码不会从数组中获取唯一元素,以防它包含重复项。所以这是修复:
var result_arr = [];
while(result_arr.length < 51){
var ind = Math.floor(Math.random()*1000);
if(text[ind] && !(text[ind] in result_arr))
result_arr.push(text[ind]);
}
作为“文本”填充了 1000 个值的数组
如果您的意思是唯一值:
var old_arr = [0,1,2,3,4,5,6,7,8,9], new_array = [];
for (var i = 0; i < 5; i++) {
var rand_elem = old_arr[Math.floor(Math.random() * old_arr.length)];
if (arrIndex(old_arr[rand_elem], new_array) == -1) {
new_array.push(rand_elem);
} else {
i--;
}
}
function arrIndex(to_find, arr) {//own function for IE support
if (Array.prototype.indexOf) {
return arr.indexOf(to_find);
}
for (var i = 0, len = arr.length; i < len; i++) {
if (i in arr && arr[i] === to_find) {
return i;
}
}
return -1;
}
如果您的意思是唯一索引:
Math.random() * 1000;
生成 50 个随机数并将它们用作数组中的位置。