【问题标题】:How to select a random member of a javascript array with n members such that every selection is as far as possible from the previous 3 selections?如何选择具有 n 个成员的 javascript 数组的随机成员,以使每个选择都尽可能远离前 3 个选择?
【发布时间】:2019-01-03 06:01:35
【问题描述】:

假设有一个包含 50 个元素的数组。每次选择一个随机元素时(所有选择的元素在后续迭代中仍然有资格重新选择),有没有办法确保这些新选择与之前选择的三个项目尽可能“远”它?当然,这对于前三个迭代无关紧要。

我所说的“远”是指与前 3 个选择的距离尽可能远(相邻​​)。

我不确定我是否有道理,因此请随时纠正我可能表现出的任何误解。

【问题讨论】:

  • 前3个选择也要尽量分散吗?
  • 到目前为止你尝试了什么?
  • 在你随机选择了前 3 个值之后,你剩下的数字不是随机的而是尽可能“最远”的数字?
  • @Zenoo 理想情况下,是的。感谢您的回复。
  • @NullPointer 如果我知道怎么做,我就不会在这里问了。感谢您的回复。

标签: javascript jquery arrays random


【解决方案1】:

如果我理解的很好,你需要取最后3个值,按值排序,得到两个数字之间的最大差值,然后返回它们之间的中间数字。

主要逻辑是这样的-

var lastThreeNumbers = [...];
lastThreeNumbers.sort();
var nextNumber;
if (lastThreeNumbers[1] - lastThreeNumbers[0] > lastThreeNumbers[2] - lastThreeNumbers[1]) {
   var diff = lastThreeNumbers[1] - lastThreeNumbers[0] / 2;
   nextNumber = lastThreeNumbers[0] + diff;
}
else {
   var diff = lastThreeNumbers[2] - lastThreeNumbers[1] / 2;
   nextNumber = lastThreeNumbers[1] + diff;
}

编辑:

另一方面,您还需要考虑 0 和 50,因此您将拥有一个包含 5 个值的数组(最后 3 个值,0 和 50)。但主要逻辑是一样的。

【讨论】:

    【解决方案2】:

    这是我尝试生成这样一个输出的代码:

    var arrayRandom = ["A", "B", "C", "D", "E", "F", "G"];
    var firstHit = 0,
      secondHit = 1,
      thirdHit = 2,
      randomIndex;
    
    function checkPrevious() {
      while (randomIndex == firstHit || randomIndex == secondHit || randomIndex == thirdHit) {
        randomIndex = Math.floor(Math.random() * arrayRandom.length);
      }
    }
    
    function generateInitialRandomIndex() {
      for (var i = 0; i < 3; i++) {
        randomIndex = Math.floor(Math.random() * arrayRandom.length);
        switch (i) {
          case 0:
            checkPrevious();
            firstHit = randomIndex;
            alert(firstHit + ":" + arrayRandom[firstHit]);
            break;
          case 1:
            checkPrevious();
            secondHit = randomIndex;
            alert(secondHit + ":" + arrayRandom[secondHit]);
            break;
          case 2:
            checkPrevious();
            thirdHit = randomIndex;
            alert(thirdHit + ":" + arrayRandom[thirdHit]);
            break;
        }
      }
    }
    
    $("button.generate-random-index").click(function() {
      generateInitialRandomIndex();
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <button class="generate-random-index">
      Hit Me
    </button>

    在这个算法中,我将数组索引作为 3 个不同变量的输入,因此每当生成随机索引时,都可以将其与之前的命中进行比较。如果相同,则生成一个新的随机索引,否则,选择它作为输出。

    Here 是指向我的小提琴的链接,您可以从中获取此代码的参考。

    希望这对您有所帮助。

    谢谢。

    【讨论】:

    • 用 ES6+ 和箭头函数来做
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多