我有许多嵌入的图像,我随机选择了4次,没有替换(一旦看到了图像,您就不能再看到它)。我想添加一个条件,它意味着无法看到一组额外的图像(不仅仅是先前选择的图像)。这些图片具有与所选图像相似的特征。
展示:
假设我有以下vars数组:BF1, BA1, BF2, BA2, BF3, BA3
我想在没有替换的情况下从数组中随机画出3个vars (图像),我也希望从下一个数组中删除具有数字2(相同集)的vars。因此,如果第一个绘制的变量是BF2,那么下一个绘制将来自以下数组:
BF1, BA1, BF3, BA3 (只有其中一个选项可以随机出现)
现在,假设我绘制了var BF1,那么下一组可能的var将是:
BF3, BA3。
我希望这是合理的。这是我到目前为止没有替换的绘图代码:
function shuffle(array){
var counter = array.length,
temp, index;
while (counter > 0){
index = Math.floor(Math.random() * counter);
counter = counter-1;
temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
var myArray = [BF1,BA1,BF2, BA2, BF3,BA3, BA4, BF4, BA5, BF5, BF6, BA6, BF7, BA7, BA8, BF8, BA9, BF9, BF10, BA10, BA11, BF11, BA12, BF12, BA13, BF13, BA14, BF14, BA15, BF15, BA16, BF16, BA17, BF17, BA18, BF18, BA19, BF19, BA20, BF20, BA21, BF21, BF22, BA23, BF23, BA24, BF24, BA25, BF25, BA26, BF26, BA27, BF27, BA28, BF28, BA29, BF29, BA30, BF30, BA31, BF31, BA32, BF33, BA33, BA34, BF35, BA35, BA36, BF36];
shuffle(myArray)发布于 2021-07-16 20:39:53
您肯定可以通过多种方式实现这一点,但无论您使用什么,都需要以某种身份执行以下3个步骤(我将它们拆分为不同的方法,但您可以根据需要组合它们):
你有洗牌例程,所以只剩下挑选和过滤器。
对于选择,我只是使用Math.random来提取列表中的一个随机成员:
return array[Math.floor(Math.random() * array.length)];对于过滤器,我使用Array.prototype.filter提取所需的项。在本例中,对于字符串,我将解析字符串中的数字,然后删除数组中与最后一个选项相同的项:
return array.filter(el => +el.match(/\d+/).join() != +picked.match(/\d+/).join());但是对于实际的图像,你只需要用你阅读图片标签的方式来代替它。
示例
下面是一个完整的工作示例,先列出选中项,然后是显示它们都被使用的排序数组。
var imageList = ['BF1', 'BA1', 'BF2', 'BA2', 'BF3', 'BA3', 'BA4', 'BF4', 'BA5', 'BF5', 'BF6', 'BA6', 'BF7', 'BA7', 'BA8', 'BF8', 'BA9', 'BF9', 'BF10', 'BA10', 'BA11', 'BF11', 'BA12', 'BF12', 'BA13', 'BF13', 'BA14', 'BF14', 'BA15', 'BF15', 'BA16', 'BF16', 'BA17', 'BF17', 'BA18', 'BF18', 'BA19', 'BF19', 'BA20', 'BF20', 'BA21', 'BF21', 'BF22', 'BA23', 'BF23', 'BA24', 'BF24', 'BA25', 'BF25', 'BA26', 'BF26', 'BA27', 'BF27', 'BA28', 'BF28', 'BA29', 'BF29', 'BA30', 'BF30', 'BA31', 'BF31', 'BA32', 'BF33', 'BA33', 'BA34', 'BF35', 'BA35', 'BA36', 'BF36'];
var selection = imageList.slice();
var picked = [];
function shuffle(array) {
var counter = array.length, temp, index;
while (counter > 0) {
index = Math.floor(Math.random() * counter);
counter = counter - 1;
temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
function pick(array) {
return array[Math.floor(Math.random() * array.length)];
}
function filterPicked(picked, array) {
return array.filter(el => +el.match(/\d+/).join() != +picked.match(/\d+/).join());
}
while (selection.length) {
// 1. Shuffle
shuffle(selection);
// 2. Pick
picked.push(pick(selection));
// 3. Filter
selection = filterPicked(picked[picked.length-1], selection);
}
console.log(`Picks: [${picked.join(', ')}]`);
console.log(`Sorted picks: [${picked.sort((a, b) => +a.match(/\d+/).join() - +b.match(/\d+/).join()).join(', ')}]`);
分步
选择数组(整个数组的副本或从选择数组中删除的所有selections)
。
发布于 2021-07-16 20:39:05
您可以使用循环和随机数对数组进行洗牌,然后在另一个循环中提取结果数组中的第一个图像,过滤在字符串末尾的数字数组。
var myArray="BF1, BA1, BF2, BA2, BF3, BA3, BA4, BF4, BA5, BF5, BF6, BA6, BF7, BA7, BA8, BF8, BA9, BF9, BF10, BA10, BA11, BF11, BA12, BF12, BA13, BF13, BA14, BF14, BA15, BF15, BA16, BF16, BA17, BF17, BA18, BF18, BA19, BF19, BA20, BF20, BA21, BF21, BF22, BA23, BF23, BA24, BF24, BA25, BF25, BA26, BF26, BA27, BF27, BA28, BF28, BA29, BF29, BA30, BF30, BA31, BF31, BA32, BF33, BA33, BA34, BF35, BA35, BA36, BF36";
function shuffle(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
const arr = shuffle(myArray.split(','));
function draw(a, times) {
let res =[]
for (let i = 1; i <= times; i++) {
let str = a[0]
res.push(str)
a = a.filter(a => parseInt(a.match(/\d+$/)[0], 10) !== parseInt(str.match(/\d+$/)[0], 10))
}
return res
}
console.log(draw(arr, 4))
https://stackoverflow.com/questions/68414252
复制相似问题