2016-10-29 8 views
0

У меня есть массив, который выводит несколько идентификаторов. Заказ следует перетасовать, но первый идентификатор должен оставаться в этом положении. Я посмотрел на Fisher-Yates (aka Knuth) Shuffle, но я не уверен, как отредактировать его для моего дела.Shuffle Array с фиксированным положением как исключение

Одним из способов может быть разбиение его на два массива. Один с единственным объектом. А затем просто перетасовать массив другим сообщением. После перетасовки я объединить два массива, как я сделал в этой скрипкой: https://jsfiddle.net/464fmfty/2/

// array listing post ids 
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; 
var arrNew = []; 

arrNew.push(arr.shift()); 
arr = shuffle(arr); 
arrNew.push(arr); 

document.body.innerHTML= arrNew; 

Но мне было интересно, если есть лучше/красивее способ сделать это?

ответ

1

shuffle функция должна быть вызвана как shuffle(arr, start, length), то код становится простым.

 
function shuffle(array, start, length) { 
    var currentIndex, i, tmp, randomIndex; 

    for (i = length; i > 1; i--) { 

    // Pick a remaining element... 
    randomIndex = start + Math.floor(Math.random() * i); 
    currentIndex = start + i - 1; 

    // And swap it with the current element. 
    tmp = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = tmp; 
    } 
} 

// array listing post ids 
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; 

shuffle(arr, 1, arr.length - 1); 

document.body.innerHTML= arr; 

Обратите внимание, что я удалил return arr, так как это сбивает с толку, когда функция изменяет массив на месте и возвращает его.

+0

Я отметил это как ответ, потому что это более читаемо и короче, чем у меня. –

-1

Ну, вместо того, чтобы выбрать 2 случайные позиции перетасовать, выбрать 2, это больше, чем 0.

var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82] 
for (var i = 0; i < 50; i++) { 
    var from = Math.floor(Math.random() * (arr.length - 1)) + 1; 
    var to = Math.floor(Math.random() * (arr.length - 1)) + 1; 
    var temp = arr[from]; 
    arr[from] = arr[to]; 
    arr[to] = temp; 
} 
+0

Этот случайный случай нечестный. –

+0

@ Роланд почему именно? –

+0

Чем больше массив получает, тем вероятнее, что элемент остается в исходном положении. –

1

Я думаю, вы могли бы сделать так

function shuffleFromOne(arr){ 
 
    var i = arr.length, 
 
     j, 
 
    tmp; 
 
    while (i > 1) { 
 
    j = Math.floor(Math.random()*--i)+1; 
 
    tmp = arr[i]; 
 
    arr[i] = arr[j]; 
 
    arr[j] = tmp; 
 
    } 
 
    return arr; 
 
} 
 

 
var arr = [1,2,3,4,5,6,7,8,9], 
 
    brr = shuffleFromOne(arr); 
 
console.log(brr);

;