【问题标题】:Javascript array shuffle shouldn't output two next to eachotherJavascript数组洗牌不应该输出两个彼此相邻
【发布时间】:2014-10-08 17:44:53
【问题描述】:

我得到了一个数组,里面有一些字母。 请参见下面的示例。 首先,我希望数组被洗牌。好吧,我找到了最著名的 shuffle,称为 Fisher-Yates shuffle。

现在我想要它输出时,例如F2 不应位于 FF' 旁边。 另一个也一样。 D 不应靠近 D2D'

它应该输出例如: R B2 U F L F D2 .... 以此类推。

而不是:R B2 B' L F D2 ...

任何帮助,建议?我知道我应该使用charAt() 检查第一个字符,但我不是该功能的专家。

Javascript

function shuffle(sides) {
    var elementsRemaining = sides.length, temp, randomIndex, last;
    while (elementsRemaining > 1) {
        randomIndex = Math.floor(Math.random() * elementsRemaining--);
        if (randomIndex != elementsRemaining) {
        temp = sides[elementsRemaining];
        sides[elementsRemaining] = sides[randomIndex];
        sides[randomIndex] = temp;
        }
    };
}

  return sides;
}

var sides = ["F ", "R ", "U ", "L ", "D ", "F2 ", "R2 ", "U2 ", "L2 ", "D2 ", "F' ", "R' ", "U' ", "L' ", "D' "];
shuffle(sides);
$('#scramble').html(sides);

【问题讨论】:

  • 你是说要保证洗牌后的数组中不会有连续的项?
  • 是的,正确的。这就是我想要的。

标签: javascript arrays shuffle charat


【解决方案1】:

您可以随机播放、检查您的约束并在不满足约束时重复。您检查约束的方法可以是

var passesConstraint = function(sides) {
    for(var i = 0; i < sides.length - 1; i++) { 
        if (sides[i][0] === sides[i+1][0]) { 
            return false;
        }
     } 
    return true;
}

你不必做charAt(),字符串也可以通过[]符号来访问。

shuffle(sides)
while (!passesConstraint(sides)) {
   shuffle(sides)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2022-01-20
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多