访问不完整数组的随机索引?

时间:2011-06-09 09:42:33

标签: javascript arrays

我有一个数组,其最大长度可达数十万行。它看起来像这样:

arr[12]   = false
arr[334]  = true
arr[753]  = true
arr[1001] = false
arr[1222] = true

依旧......

我想找到一种随机选择真实行的索引的最快方法......

我最初的尝试是这样做:

for(k in arr) {
 if(arr[k]) {
  candidate.push(k);
 }
}

return Math.floor(Math.random() * candidate.length);

但它很慢。

有更好的方法吗?

5 个答案:

答案 0 :(得分:1)

如果缺失元素的分数足够小,那么它将足够快,只能生成随机索引,直到您获得命中。试一试。

var chose_true = function(array) {
    while (true) {
        var index = Math.floor(Math.random() * array.length)
        if (array[index]) {
            return array[index];
        }
    }
}

答案 1 :(得分:1)

while(true)
{
    var index = Math.floor(Math.random() * array.length)
    if(arr[index])
        return index;
}

如果有很多真实的话它会很快而且如果有很多谬误则会很慢,但至少比你的解决方案更快

答案 2 :(得分:0)

据我所知,没有很好的方法可以做到这一点。

我试图使用的那个,当你用数组填充真/假元素时,将一个辅助结构推到真值的索引上。之后,生成这些值的随机值应该很容易,并且您肯定会在该索引上获得真值。

答案 3 :(得分:0)

您最好的解决方案是为此阵列创建另一个索引:

每次修改此数组时,都会将所有true值的索引重建为某些true_values数组。例如:

function addNewIndex(key, value) {
   arr[key] = value;
   if (value) {
       true_arr.push(key); //<<<<
   }
}

然后只需从您构建的索引中选择随机元素。

答案 4 :(得分:0)

如果这个数组会不断变化,如果它非常大,并且真元素的数量非常少,那么保留True索引列表怎么样?

当索引变为true时,它将被添加到列表中,当索引设置为false时,它将从列表中删除,然后您可以通过从真实索引列表中选择随机元素来选择索引