2011-02-09 2 views
1

быстрый вопрос:JavaScript: генерировать 2 случайные, но различные числа из диапазона

Что является лучшим способом для реализации этой строки кода Python (генерирует два случайных, но различные числа из заданного диапазона) ...

random.sample(xrange(10), 2) 

... в Javascript?

Заранее благодарен!

Martin

ответ

5

Вот моя попытка с помощью сращивания:

var a = [1,2,3,4,5,6,7,8,9,10];var sample = []; 
sample.push(a.splice(Math.random()*a.length,1)); 
sample.push(a.splice(Math.random()*a.length,1)); 

Облаченный в функции:

function sample_range(range, n) { 
    var sample = []; 
    for(var i=0; i<n; i++) { 
    sample.push(range.splice(Math.random()*range.length,1)); 
    } 

    return sample; 
} 

var sample = sample_range([1,2,3,4,5,6,7,8,9,10], 2); 

Мы могли бы также наклеить функцию в Array.prototype, чтобы иметь что-то вроде точки синтаксиса нотации:

Array.prototype.sample_range = function(n) { 
    var sample = []; 
    for(var i=0;i<n;i++) { 
     sample.push(this.splice(Math.random()*this.length,1)); 
    } 
    return sample; 
}; 
var sample = [1,2,3,4,5,6,7,8,9,10].sample_range(2); 
+0

Производительность на этом O (диапазон n *). Я бы не предложил его использовать. Вам будет лучше запускать n итераций Knuth shuffle, который будет O (n), если вы предположите, что массив массивов уже создан, в противном случае O (n + range). – Brian

0

Генерировать один, а затем повторно генерировать второй, пока это не то же самое, как первый. Крошечный шанс, что ему придется работать дольше, но вы не увидите ни одного удара по производительности, если вам не нужно генерировать миллиарды чисел.

4

Если вы хотите сгенерировать случайные числа от 0 до n, один из способов - произвольно выбрать номер r1 в 0..n, затем выбрать r2 от 0..n-1 и добавить 1 до r2, если r2 >= r1.

1
function sample(range,tot){ 
    if(tot > range){ 
     alert('infinite loop?'); 
     return []; 
    } 
    var myRandomNumbers = []; 
    for(var i = 0; i<tot; i++){ 
     var randN = Math.floor(Math.random()*range); 
     while(myRandomNumbers.contains(randN)){ 
      randN = Math.floor(Math.random()*range); 
     } 
     myRandomNumbers.push(randN); 
    } 
    return myRandomNumbers 
} 

var nums = sample(10,2); //array containing 2 distinct random numbers 
Смежные вопросы