【问题标题】:How to make JS more random?如何让JS更随机?
【发布时间】:2020-12-08 20:50:08
【问题描述】:

我的代码是一个喝酒或敢于玩的游戏。每次用户单击按钮时,它会抽取 1 张饮料卡和 1 张通配符。我遇到的问题是它多次选择相同的卡片,并且随机选择没有足够的多样性使其变得有趣。有什么办法可以减少选择相同卡片的次数。有时同一张牌会连续被选中 2 或 3 次。

    var cards = [
    '1-wildcard',
    '2-wildcard',
    '3-wildcard',
    '4-wildcard',
    '5-wildcard',
    '6-wildcard',
    '7-wildcard',
    '8-wildcard',
    '9-wildcard',
    '10-wildcard',
    '11-wildcard',
    '12-wildcard',
    '13-wildcard',
    '14-wildcard',
    '15-wildcard',
    '16-wildcard',
    '17-wildcard',
    '18-wildcard',
    '19-wildcard',
    '20-wildcard',
    '21-wildcard',
    '22-wildcard',
    '23-wildcard',
    '24-wildcard',
    '25-wildcard',
    '26-wildcard',
    '27-wildcard',
    '28-wildcard',
    '29-wildcard',
    '30-wildcard'
];   

var drinks = [
    '1-drink',
    '2-drinks',
    '3-drinks',
    '4-drinks',
    '5-drinks',
    '6-drinks',
    '7-drinks',
    '8-drinks',
    '9-drinks',
    '1-shot',
    '2-shots',
    '3-shots',
    '4-shots'
]


function drawCard() {
        var randomNumber = Math.floor(Math.random() * (cards.length - 1));
        var randomNumber1 = Math.floor(Math.random() * (drinks.length - 1));
        console.log(cards.length);
        console.log(cards[randomNumber]);
        document.getElementById("drinks").src = 'assets/js/games/cards/drinkordare/' + drinks[randomNumber1] + '.png';
        document.getElementById("wildcard").src = 'assets/js/games/cards/drinkordare/' + cards[randomNumber] + '.png';

        switch(cards[randomNumber]) {
            
        }

        switch (drinks[randomNumber1]) {

        }
}

【问题讨论】:

  • 您连续获得 2 或 3 个相同的频率是多少?连续多次获得同一张卡片仍然是随机的,但如果你想避免这种情况,你可以跟踪最后选择的几张卡片,并继续随机选择一张新卡片,直到它不是最近的重复。跨度>
  • 人类不太擅长评估随机性,但非常擅长检测模式,即使没有模式。如果你只有 13 张“饮料”牌,那么平均每 13 次你就会得到同一张牌,有时会更频繁,因为这就是随机性的运作方式。所以你真正想要的是 less 随机的东西,避免再次选择相同的卡片。

标签: javascript html random playing-cards


【解决方案1】:

您可以将最后选择的卡片添加到临时数组(我们称之为卡片 A),然后在剩余卡片中选择下一张卡片。然后,当(例如 5 个)在卡片 A 之后又有更多卡片被选中时,您将卡片 A 再次推回初始阵列,如此一来。

这消除了在保持算法随机的同时连续选择(在本例中为 5 张)牌的可能性。例如,我用卡片做了这个算法(但请注意,它与饮料的算法相同,您只需要更改名称和数组)。

let cards = ['1-wildcard','2-wildcard','3-wildcard','4-wildcard','5-wildcard','6-wildcard','7-wildcard','8-wildcard','9-wildcard','10-wildcard','11-wildcard','12-wildcard','13-wildcard','14-wildcard','15-wildcard','16-wildcard','17-wildcard','18-wildcard','19-wildcard','20-wildcard','21-wildcard','22-wildcard','23-wildcard','24-wildcard','25-wildcard','26-wildcard','27-wildcard','28-wildcard','29-wildcard','30-wildcard'];
let lastSelectedCards = [];

function getRandomCard() {
  let bufferSize = 5; // If you pick a card, the next 5 cards will not be the same
  let randomNumber = Math.floor(Math.random() * (cards.length - 1));
  
  // Push to the selected array and removes from the cards array
  lastSelectedCards.push(cards[randomNumber]);
  cards.splice(randomNumber, 1);
  
  // Push back the last element in the cards array after 5 new random cards selected
  if (lastSelectedCards.length == bufferSize + 2) {
    cards.push(lastSelectedCards.shift());
  }
  
  // Returns the last selected card
  return lastSelectedCards[lastSelectedCards.length - 1];
}

// Select 10 cards for testing
for (let i = 0; i < 10; i++) {
  console.log(getRandomCard());
}

【讨论】:

    【解决方案2】:

    您可以通过制作数组的随机副本、从中弹出并在用完时重新填充来防止重复 - 如下所示:

    var cards = ["a", "b", "c"], shuffledCards = [];
    for(var i = 0; i < 10; i++) console.log((shuffledCards = shuffledCards.length ? shuffledCards : randoSequence(cards)).pop().value);
    &lt;script src="https://randojs.com/2.0.0.js"&gt;&lt;/script&gt;

    此代码使用Rando.js 洗牌,但您可以参考shuffle with plain JavaScript

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      相关资源
      最近更新 更多