2016-10-29 61 views
0

我有一個輸出多個ID的數組。訂單應該洗牌,但第一個ID應該留在這個位置。 我看過Fisher-Yates(又名Knuth)Shuffle,但我不確定如何爲我的情況進行編輯。具有固定位置的隨機數組作爲例外

一種方法可能是將其拆分成兩個數組。一個與單個對象。然後只是用另一個帖子洗牌。洗牌之後,我結合了兩個數組像我一樣在這個小提琴: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

@Roland爲什麼呢? –

+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);

做;