首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何随机化而不替换条件?

如何随机化而不替换条件?
EN

Stack Overflow用户
提问于 2021-07-16 19:15:40
回答 2查看 84关注 0票数 0

我有许多嵌入的图像,我随机选择了4次,没有替换(一旦看到了图像,您就不能再看到它)。我想添加一个条件,它意味着无法看到一组额外的图像(不仅仅是先前选择的图像)。这些图片具有与所选图像相似的特征。

展示:

假设我有以下vars数组:BF1, BA1, BF2, BA2, BF3, BA3

我想在没有替换的情况下从数组中随机画出3个vars (图像),我也希望从下一个数组中删除具有数字2(相同集)的vars。因此,如果第一个绘制的变量是BF2,那么下一个绘制将来自以下数组:

BF1, BA1, BF3, BA3 (只有其中一个选项可以随机出现)

现在,假设我绘制了var BF1,那么下一组可能的var将是:

BF3, BA3

我希望这是合理的。这是我到目前为止没有替换的绘图代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-16 20:39:53

您肯定可以通过多种方式实现这一点,但无论您使用什么,都需要以某种身份执行以下3个步骤(我将它们拆分为不同的方法,但您可以根据需要组合它们):

  1. 混乱列表,
  2. 选择一个项目
  3. 筛选出匹配该选项的项(在本例中,是那些具有相同数字的项目)

你有洗牌例程,所以只剩下挑选和过滤器。

对于选择,我只是使用Math.random来提取列表中的一个随机成员:

代码语言:javascript
复制
return array[Math.floor(Math.random() * array.length)];

对于过滤器,我使用Array.prototype.filter提取所需的项。在本例中,对于字符串,我将解析字符串中的数字,然后删除数组中与最后一个选项相同的项:

代码语言:javascript
复制
return array.filter(el => +el.match(/\d+/).join() != +picked.match(/\d+/).join());

但是对于实际的图像,你只需要用你阅读图片标签的方式来代替它。

示例

下面是一个完整的工作示例,先列出选中项,然后是显示它们都被使用的排序数组。

代码语言:javascript
复制
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)

  • Pick ),将其推送到选择数组的
  1. 筛选器中,以删除与每个新筛选的数组匹配的最后一次选择
  2. 重复1-3的项,直到没有选择保留

票数 1
EN

Stack Overflow用户

发布于 2021-07-16 20:39:05

您可以使用循环和随机数对数组进行洗牌,然后在另一个循环中提取结果数组中的第一个图像,过滤在字符串末尾的数字数组。

代码语言:javascript
复制
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))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68414252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档