我有一個陣列陣列,我需要選擇 (index1, index2) 的 2 個隨機和不同的組合
讓我舉個例子吧
data = [["a", "b", "c", "d"], ["e", "g"], ["i", "j", "k"]]
我需要有 (index1: 0 , index2: 2) 和 (index1: 2 , index2: 1)
我怎樣才能有效地實作這一目標?
uj5u.com熱心網友回復:
首先,您可以創建一個組合:
const i11 = Math.floor(Math.random() * data.length);
const i12 = Math.floor(Math.random() * data[i11].length);
然后你可以檢查內部陣列是否只有一個元素。如果它只有一個元素并且是第一個組合,則應在以下步驟中忽略它:
const dataLength = data[i11].length > 1 ? data.length : data.length - 1;
現在您可以為第二個組合生成外部索引并進行調整:
let i21 = Math.floor(Math.random() * dataLength);
if (i21 >= i11 && data[i11].length === 1) i21;
接下來可以檢查第一個組合的外層索引和第二個組合的外層索引是否相同并做相同的調整以避免重復:
const innerDataLength = i21 === i11 ? data[i21].length - 1 : data[i21].length;
最后你可以生成第二個內部索引并調整它
let i22 = Math.floor(Math.random() * innerDataLength);
if (i21 === i11 && i22 >= i12) i22;
整個代碼作為一個帶有測驗的函式:
const data = [["a", "b", "c", "d"], ["e", "g"], ["i", "j", "k"]];
function combinations(data) {
const i11 = Math.floor(Math.random() * data.length);
const i12 = Math.floor(Math.random() * data[i11].length);
const dataLength = data[i11].length > 1 ? data.length : data.length - 1;
let i21 = Math.floor(Math.random() * dataLength);
if (i21 >= i11 && data[i11].length === 1) i21;
const innerDataLength = i21 === i11 ? data[i21].length - 1 : data[i21].length;
let i22 = Math.floor(Math.random() * innerDataLength);
if (i21 === i11 && i22 >= i12) i22;
return [[i11, i12], [i21, i22]];
}
console.log(combinations(data));
for (let i = 0; i < 10000; i) {
const [[i11, i12], [i21, i22]] = combinations(data);
if (i11 === i21 && i12 == i22) console.log('Test failed!');
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347632.html
標籤:javascript
下一篇:無法使用默認值讀取未定義的屬性
