2015-09-09 5 views
1

Интересно, какой самый эффективный способ написать функцию, которая берет два массива случайных чисел и заканчивается, когда найдена пара подходящих целых чисел.Выбор случайных целых чисел из 2 массивов до тех пор, пока условие не будет истинным

В следующем примере представлены два массива, один больше, чем другой. Больший массив содержит потенциальные делители, меньший массив - делители. Я бы хотел, чтобы функция вычислила, пока не найдет пару divident и divisor, которые делятся без остатка.

Пример:

var listDivident = _.shuffle(_.range(1, 101)); 
var listDivisor = _.shufle(_.range(1, 11)); 

randomMatch = function (listDivident, listDivisor) { 
    /* until ((listDivident % listDivisor !== "undefined") 
     && (listDivident % listDivisor === 0) { 
     ... 
     } 
    */ 
    return { 
     matchDivident: matchDivident, 
     matchDivisor: matchDivisor 
    }; 
}; 

Есть ли что-то вроде функции "до" или построить в JS?

Благодарим за помощь! Vin

+0

Вместо того, чтобы думать «До XXX до ...», подумайте об этом как «Пока это не сделано, продолжайте». – csmckelvey

+0

Вам нужен цикл while. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/while – Tro

ответ

1

Если ваши массивы не очень большие, вы можете сначала сгенерировать все допустимые пары, а затем выбрать случайный:

var pairs = []; 

_.each(listDivident, function(a) { 
    _.each(listDivisor, function(b) { 
     if(!(a % b)) 
      pairs.push([a, b]) 
    }) 
}); 

result = _.shuffle(pairs)[0]; 
+0

спасибо! Я использовал '_.sample (pairs)' для результата, чтобы он был еще короче :) –

1

То, что вы называете «до» не может быть достигнуто с помощью цикла до вы не найдете то, что вам нужно:

var listDivident = _.shuffle(_.range(1, 101)); 
var listDivisor = _.shufle(_.range(1, 11)); 

randomMatch = function (listDivident, listDivisor) { 
    var i = 0, 
     found = false, 
     dividentLength = listDivident.length, 
     divisorLength = listDivisor.length, 
     matchDivident = null, 
     matchDivisor = null; 
    while (!found && i < dividentLength && i < divisorLength) { 
     if (listDivident[i] % listDivisor[i] === 0) { 
      matchDivident = listDivident[i]; 
      matchDivisor = listDivisor[i]; 
      found = true; 
     } else { 
      i++; 
     } 
    } 
    return { 
     matchDivident: matchDivident, 
     matchDivisor: matchDivisor 
    }; 
}; 

EDIT: После этого, просто вызовите randomMatch() с целыми массивами:

alert(randomMatch(listDivident, listDivisor)); 
+0

спасибо за ваш обильный ответ! Я буду придерживаться реакции Джорга, так как его короткая нагрузка. –

Смежные вопросы