如何使JS更随机?

问题描述

我的代码是喝酒或冒险游戏。每次用户单击按钮时,它将抽取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]) {

        }
}

解决方法

您可以将最后选择的卡添加到临时阵列(称为卡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());
}

,

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

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

此代码使用Rando.js进行随机播放,但如果您引用,则可以shuffle with plain JavaScript

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...