来自不同数组的随机组合,不重复
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);
}
};
有没有办法在推送之前将随机 model 与 cards 中的现有对象进行比较,然后再次将其随机化多次如果该组合已经存在,则需要?
注意:计划仅使用一次生成 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);
该站点非常新,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);
}
};
有没有办法在推送之前将随机 model 与 cards 中的现有对象进行比较,然后再次将其随机化多次如果该组合已经存在,则需要?
注意:计划仅使用一次生成 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);