javascript - 如何使用 rand 和 split 函数避免特定的 3 元素组合?

标签 javascript random split

我有一个包含 7 个元素的变量,我需要随机选择 3 个元素,但这里是我希望它避免的特定 3 个元素组合。我该如何编码? (例如,我需要它来避免组合 [2,5,7] 和 [1,3,6])

这是我目前所拥有的:

var Allregions = [
'1',
'2',
'3',
'4',
'5',
'6',
'7']


var ShowRegions = [];
    do {
      ShowRegions [ShowRegions.length] = Allregions.splice(
                            Math.floor(Math.random() * Allregions.length)
                          , 1)[0];
} while (ShowRegions.length < 3);

编辑:我想澄清一些事情:“数字”只是占位符,因为它们实际上是从代码的不同部分调用元素。即 1 实际上类似于“页面横幅”。因此,我编写的代码可以很好地选择 3 个独特元素来填充网页,但它不允许我控制(不)显示哪 3 个元素组合。

最佳答案

此函数将返回一个没有重复字母序列且没有排除项的随机数。

var allRegions = ['1', '2', '3', '4', '5', '6', '7'];

// to skip sequence of repeated letters.
var isSequence = /^([a-zA-Z0-9])\1+$/;
// to skip, if the combination has duplicates.
var hasDuplicates = /([a-zA-Z0-9]).*?\1/;

function isNotUniqueCombination(ex, rand) {
  for (var n = 0; n < ex.length; n++) {
    var e = ex[n];
    var combinations = [
      [e[0], e[1], e[2]],
      [e[0], e[2], e[1]],
      [e[1], e[0], e[2]],
      [e[1], e[2], e[0]],
      [e[2], e[0], e[1]],
      [e[2], e[1], e[0]]
    ];
    for (var i = 0; i < combinations.length; i++) {
      var com = combinations[i];
      if (com.join("") === rand.join("")) return true;
    }
  }
  return false;
}

/**
 * Return a random number without sequence of repeated letters & without excludes
 * @param {String} array 
 * @param {String} excludes 
 */
function getRandom(array, excludes) {

  // Random number array
  var randomNumber = [];

  var excludesMap = excludes.map(function(e) {
    return e.join("");
  });

  do {
    // Generate random number
    randomNumber = [
      array[Math.floor(Math.random() * array.length)],
      array[Math.floor(Math.random() * array.length)],
      array[Math.floor(Math.random() * array.length)]
    ];

  } while (excludesMap.indexOf(randomNumber.join("")) !== -1 || isSequence.test(randomNumber.join("")) || hasDuplicates.test(randomNumber.join("")) || isNotUniqueCombination(excludes, randomNumber));

  return randomNumber;
}

var excludes = [
  ['2', '5', '7'],
  ['1', '3', '6']
];


// Test Case
// =========
for (var i = 0; i < 1e3; i++) {
  var arr = getRandom(allRegions, excludes);

  var div = document.createElement('div');
  div.innerHTML = arr.join("");
  document.body.appendChild(div);

  // Check if the string contains a sequence of repeated letters of has duplicates
  if (isSequence.test(arr.join("")) || hasDuplicates.test(arr.join("")) || isNotUniqueCombination(excludes, arr)) {
    div.style.color = "#ff0000";
    div.innerHTML += " [ sequence of repeated letters found || duplicates found ]";
    document.body.appendChild(div);
    break;
  }

}
// ===

关于javascript - 如何使用 rand 和 split 函数避免特定的 3 元素组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979058/

相关文章:

javascript - 通过 Safari Extension 获取选中的文本

javascript - 获取随机数并关注限制(抛物线)

c# - String.Split() 删除前导零

python - 根据唯一值拆分嵌套列表

javascript - jquery ui Accordion 避免在单击另一个项目时关闭项目

javascript - 如何为排除无穷大和 NaN 的数字声明 Flow 类型?

javascript - 使用 grunt-protractor-runner 将 "process.argv[3]"等参数传递给 Protractor

c - 扩展 rand() 的范围时改进 "randomness"

C++ 11 std::binomial_distribution 不稳定

php - 如何在PHP中拆分汉字?