来自不同数组的随机组合,不重复

Random combinations from different arrays with not repetition

该站点非常新,javascript 如此。 在论坛上找了一段时间,但找不到我要找的答案,或者至少无法理解我读过的帖子。

我正在尝试制作一个生成器,根据需要创建上述数组的尽可能多的组合,而无需重复组合,并且每次迭代仅使用每个数组的一项。我还需要添加一些额外的需求,例如迭代的唯一 ID 和额外的 属性 来标记所有属性都具有相同值的迭代。

这是代码

var accesories = ["pijama" , "urban" , "joker" , "joyboy" , "crypto"];
var hats = accesories;
var tshirts = accesories;
var boots = accesories;


var cards = [];

function randomizeParts() {
model.accesories = accesories[Math.floor(Math.random() * 5)];
model.hats = hats[Math.floor(Math.random() * 5)];
model.tshirts = tshirts[Math.floor(Math.random() * 5)];
model.boots = boots[Math.floor(Math.random() * 5)];
};


function addInsomnio (quantity) {

for (let i = 1 ; i <= quantity ; i++){
    model = {
        id : 0,
        accesories: 0,
        hats: 0,
        tshirts: 0,
        boots: 0}

    //adding four digits id

    i < 10 ? model.id = '000' + i : i < 100 ? model.id = '00' + i : i < 1000 ? model.id = '0' + i : i <= 10000 ? model.id = i :false;

    //randomizing parts

    randomizeParts() 

    //checking if rarity was generated

   model.accesories === model.hats && model.accesories === model.tshirts && model.accesories === model.boots ? model.rarity = "original" : false;
    
    //checking its unique
    
   // ????

    //Pushing a beautifull brand new and unique card

    cards.push(model);
 }

};

有没有办法在推送之前将随机 modelcards 中的现有对象进行比较,然后再次将其随机化多次如果该组合已经存在,则需要?

注意:计划仅使用一次生成 10,000 个项目json作为对 photoshop 脚本的支持。

您可以用唯一的编号来标识每个组合,并维护一组已使用的编号:

function choices(count, ...arrays) {
    let used = new Set;
    let size = arrays.reduce((size, arr) => size * arr.length, 1);
    if (count > size) count = size;
    let result = [];
    for (let i = 0; i < count; i++) {
        let k;
        do {
            k = Math.floor(Math.random() * size);
        } while (used.has(k));
        used.add(k);
        result.push(arrays.reduce((acc, arr) => {
            acc.push(arr[k % arr.length]);
            k = Math.floor(k / arr.length);
            return acc;
        }, []));
    }
    return result;
}

let accesories = ["a", "b", "c", "d", "e"];
let hats = ["A", "B", "C", "D", "E"];
let tshirts = ["1", "2", "3", "4", "5"];
let boots = [".", ";", "?", "!"];

// Get 10 choices:
let result = choices(10, accesories, hats, tshirts, boots);
console.log(result);