来自1000个元素数组的50个随机唯一元素?

时间:2012-05-21 15:20:09

标签: javascript arrays random

从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.

8 个答案:

答案 0 :(得分:4)

显而易见的(对我而言)是将数组洗牌,然后取出前50个元素。 This question有一个很好的方法来改组数组,然后你可以slice前50个元素。这保证了元素的独特性。

所以,在那里使用函数:

fisherYates(text);
text = text.slice(0, 50);

答案 1 :(得分:1)

this topic中解释了很好的算法(在C中你可以很容易地在JS中做同样的事情)

答案 2 :(得分:0)

查看Fisher-Yates algorithm,我认为这对您有用。

答案 3 :(得分:0)

如果您的意思是唯一的值:

<强> Demo

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;
}

如果您的意思是唯一索引:

  • 生成随机索引并将索引存储在数组中并进行检查以防止重复
  • 在获取数组之后开始删除数组元素(如果缓存长度,可能会出现问题,所以不要这样做)

答案 4 :(得分:0)

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个值

填充数组

答案 5 :(得分:0)

这假设您的意思是随机索引而不是具有唯一值的索引。

一种方法是复制数组并删除你使用的数组:

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);

答案 6 :(得分:-1)

设置一个等于Math.random()的变量,每次循环运行时调用它,并使变量成为索引。通过数组的大小来修改随机调用,在本例中为1000.这将为您提供50个随机元素。

答案 7 :(得分:-2)

Math.random()* 1000;

生成50个随机数并将它们用作数组中的位置。