2013-06-23 4 views
1

У меня есть массив какПроизвольно выберите пары из массива

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

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

т.е. так, например, если я поступил (5) - это прикажет случайные записи в новый массив, как

[1, 4, 7, 10, 12]

Я попытался

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
var newArr = [], num, roll; 
//remove number from array 
for(var i =0; i < arr.length; i++) { 
num = Math.floor(Math.random() * arr.length); 
newArr.push(arr[num]); 
roll = arr.splice(num, 1); 
} 

Но это на самом деле не возвращение что мне нужно, поскольку мне нужно, чтобы заказ остался. Я использую символ подчеркивания, если это помогает?

+0

Хорошо хорошо вы можете предоставить решение в JavaScript? он будет по-прежнему полезен для членов сайта – Andy

+0

, и ваша формула будет более случайным шумом perlin, поэтому вы можете также захватить записи массива, случайно перебирая «i» до вашего желаемого массива и затем сортировать его. –

+0

Итак, [этот] (http://stackoverflow.com/q/11935175/102441) – Eric

ответ

-1

Просто, чтобы помочь здесь - вероятно, вы должны сделать что-то вроде @ ссылку Эрика выше

function getRandomSubarray(arr, size) { 
    var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index; 
    while (i-- > min) { 
     index = Math.floor(i * Math.random()); 
     temp = shuffled[index]; 
     shuffled[index] = shuffled[i]; 
     shuffled[i] = temp; 
    } 
    return shuffled.slice(min); 
} 

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; 

var newArr = getRandomSubarray(x, 6).sort(function(a,b) { return a - b }); 

console.log(newArr) 

Это должно вернуть то, что вы ищете. Хотя это слишком большой для меня. Использование underscore

function randomSort(a, n) { 
    return _.take(_.shuffle(a), n).sort(function(a,b) { return a - b }); 
} 

console.log(randomSort(x, 6)) 
+0

Не будет работать с разреженным массивом и не будет иметь правильный порядок, если вы используете этот параметр var x = [1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15] .reverse(); ' – Xotic750

+0

вы шутите? в какой момент ОП просил об этом? прочитайте вопрос и ответьте на ответ. – Tim

+0

Зачем мне шутить? И в какой момент он этого не сделал? Вам нужно только добавить такую ​​информацию, как заметку, и ваш ответ будет улучшен. Я уже сделал. как вы думаете, что он имел в виду под «парами» или «подобным массивом», и «мне нужно, чтобы заказ оставался»? По общему признанию, вопрос ОП не кристально чист, но это не значит, что наших ответов не должно быть. Кроме того, вы могли бы даже предоставить справочную/ссылку информацию о том, что вы используете, Fisher-Yates (на самом деле я мог бы это сделать), но я бы счел нужным больше. – Xotic750

-1

Вот еще один вариант:

function getRandomSorted(arr, limit) { 

    limit = limit || 1; 
    var random = []; 

    for (var i=0; i<limit; i++) { 
    var rand = arr[0|Math.random() * arr.length]; 
    if (~random.indexOf(rand)){ --i; continue; } 
    random.push(rand); 
    } 

    return random.sort(function(a,b){ return a-b }); 
} 

getRandomSorted(arr, 5); 

Это будет работать с числами и строками.

+0

Не будет работать с разреженным массивом и не имеет правильного порядка, если вы используете этот 'var x = [1,2,3,4,5,6,7,8,9,10,11,12,13 , 14,15] .reverse(); ' – Xotic750

+0

Я не вижу, где вы получаете эти требования, это работает, насколько показывает пример OP. Во всяком случае, вопрос был закрыт. – elclanrs

+0

Слово «пары» в заголовке «массив вроде» и тот, который я дал, также «нравится», «мне нужно, чтобы порядок оставался», если только массив не сортируется, то ваш вид изменит заказ. Но да, вопрос был отмечен как дубликат, но я не думаю, что это то же самое, что и те вопросы, которые были упомянуты. – Xotic750

0

Я думаю, что это то, чего вы пытаетесь достичь. Работает с разреженными массивами и поддерживает индекс исходных элементов. Использование атрибута count, равное или превышающее длину предоставленного массива, вернет копию этого массива.

Javascript

/*jslint maxerr: 50, indent: 4, browser: true, bitwise: true */ 
/*global console */ 

(function() { 
    "use strict"; 

    function customRand(array, count) { 
     var length = array.length, 
      indexes = [], 
      result = [], 
      i = 0, 
      rand, 
      temp; 

     while (i < length) { 
      if (Object.prototype.hasOwnProperty.call(array, i)) { 
       indexes.push(i); 
      } 

      i += 1; 
     } 

     i = 0; 
     length = indexes.length; 
     while (i < length) { 
      rand = (Math.random() * i) | 0; 
      temp = indexes[i]; 
      indexes[i] = indexes[rand]; 
      indexes[rand] = temp; 
      i += 1; 
     } 

     indexes = indexes.slice(0, count).sort(function (a, b) { 
      return a - b; 
     }); 

     i = 0; 
     length = indexes.length; 
     while (i < length) { 
      result[indexes[i]] = array[indexes[i]]; 
      i += 1; 
     } 

     return result; 
    } 

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; 

    console.log(customRand(arr, 5)); 
}()); 

На jsfiddle