我有兩個字串陣列:
var array1 = ["word1", "word2", "word3", "word4", "word5", "word6"];
var array2 = ["word7", "word8"];
我需要將這些陣列連接成一個新陣列并以隨機順序對元素進行洗牌。但是,來自array2should repeat 的元素在這個新陣列中出現了兩次,并且給定元素的重復必須彼此相距至少兩個元素。
這是滿足這些條件的示例結果:
["word7", "word3", "word8", "word7", "word1", "word4", "word6", "word8", "word5", "word2"];
所有元素的順序都是隨機的,重復的元素之間至少有兩個其他元素。如何撰寫一個函式(最好不使用額外的庫)來創建滿足上述條件的隨機排序陣列?我嘗試過擴展標準排列演算法(例如 Fisher-Yates),但由于我對 JS 不太熟悉,所以我在實作上遇到了麻煩。
非常感謝任何幫助 - 謝謝!
uj5u.com熱心網友回復:
最簡單的可能是分兩步完成。
array1使用標準的 Fisher-yates 演算法洗牌。- 在滿足條件的隨機位置插入元素。
即類似于以下內容(我假設,您可以實作fisher yates,因此我沒有在此處包含它,只是制作了一個(未洗牌的)陣列副本)
let array1 = [1,2,3,4,5,6,7]
let array2 = [8,9]
let rand = (n) => Math.floor(Math.random()*n);
//let shuffled = fisheryates(array1);
let shuffled = array1.slice(); //just make a copy of the array
while (array2.length) {
let e = array2.splice(rand(array2.length), 1)[0];
let i1 = shuffled.length == 2
? 0
: rand(shuffled.length 1);
let i2 = 0;
do {
i2 = shuffled.length == 2
? 2
: rand(shuffled.length 1);
}
while (Math.abs(i1 - i2) < 2)
if (i1 < i2) {
shuffled.splice(i2, 0, e);
shuffled.splice(i1, 0, e);
} else {
shuffled.splice(i1, 0, e);
shuffled.splice(i2, 0, e);
}
}
console.log(shuffled)
它是如何作業的:
array2以隨機順序遍歷所有元素
你會得到一個隨機索引來插入第一個元素。如果
shuffled只有 2 個元素,則唯一有效的索引是 0 和 2(因為這是唯一的方法,它們之間至少有兩個元素)。我在shuffled.length 1這里使用,因為這允許在陣列末尾插入元素。然后你需要找到另一個索引,它距離第一個索引至少兩個元素。最簡單(但不一定是最快)的方法就是嘗試直到找到索引。
在陣列中插入元素時,必須先插入較大的索引,否則上方的元素將位于錯誤的位置。
如果array1只有一個元素,則至少需要兩個元素array2才能生成有效的輸出,但作為特殊情況,您可以手動完成。
let array1 = ['a']
let array2 = ['x', 'y', ...]
let shuffled = ['x', 'y', 'a', 'x', 'y'] //or yxayx
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417723.html
標籤:
