2015-07-31 2 views
2

кроме я могу перетасовать массив с этой функциейПеремешать массив для JavaScript даже индекса

function getBadlyShuffledList(list) { 
    var length = list.length; 
    var i; 
    var j; 

    while (length) { 
    i = Math.floor(Math.random() * length--); 


     j = list[length]; 
     list[length] = list[i]; 
     list[i] = j; 

    } 
    return list; 
} 

console.log(getBadlyShuffledList([1,2,3,4,5,6])); 

Проблема в том, я должен оставить индекс, которые делятся на два в своих местах. Я пробовал использовать оператор if, и он получает индекс, если он равен 2 или 4, но тогда я не знаю, что делать, чтобы он оставался на месте.

Например, если у меня есть массив [1, 2, 3, 4, 5, 6] При перетасовке 3 и 5 должны оставаться на месте. ех; [2, 4, 3, 1, 5, 6] Как мне это сделать?

+0

не то, что в то время как бесконечный цикл, так как длина не меняется – depperm

+0

@depperm, 'длина -' <- это не изменение. –

+3

Ваш пример и ваши требования не совпадают. Если это индексы (или индексы, но не индексы :)), делящиеся на 2, это должны быть индексы 0, 2 и 4, или числа 1, 3 и 5. –

ответ

2

Я одолжил функцию воспроизведения в случайном порядке по следующей ссылке ... How to randomize (shuffle) a JavaScript array?

Построить массив, содержащий элементы, которые вы хотите, чтобы перемешать. Перемешайте их. И, наконец, добавьте каждый элемент один за другим обратно в исходный массив, пропустив каждый другой элемент. Он работает, но есть возможности для оптимизации.

/** 
* Randomize array element order in-place. 
* Using Fisher-Yates shuffle algorithm. 
*/ 
function shuffleArray(array) { 
    for (var i = array.length - 1; i > 0; i--) { 
     var j = Math.floor(Math.random() * (i + 1)); 
     var temp = array[i]; 
     array[i] = array[j]; 
     array[j] = temp; 
    } 
    return array; 
} 


function getBadlyShuffledList(list) { 

    listToShuffle = [] 

    for(var i=0; i < list.length; i++){ 
    if (i%2!==0){ 
     listToShuffle.push(list[i]); 
    } 
    } 

    shuffleArray(listToShuffle); 

    for(var i=0; i < list.length; i++){ 
    if (i%2!==0){ 
     list[i] = listToShuffle[0]; 
     listToShuffle.shift(); 
    } 
    } 

    return list; 
} 

console.log(getBadlyShuffledList([3, 1, 2, 3, 4, 5, 6, 6, 6, 9, 2])); 
+0

Я не уверен, как OP намеревался получить результат, но я думаю, что это неправильно: '[3, 1, 2, 3, 4, 5, 6, 6, 6, 9, 2] '=>' [3, 5, 2, 9, 4, 1, 6, 3, 6, 6, 2] ' – Rudie

+0

То, как я читаю OP, должен быть любым другим элементом, который остается тем же, начиная с первого. В вашем массиве. 3. 2. 4. 6. 6. 2 все находятся в одном и том же положении на выходе с другими элементами, перетасованными вокруг. – abaldwin99

+1

omg SHUFFLE, я прочитал СОРТ. Bla. Сожалею. Это трюк =) – Rudie

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