美文网首页
从一副卡牌中随机抽取五张牌,且不能重复

从一副卡牌中随机抽取五张牌,且不能重复

作者: zdxhxh | 来源:发表于2020-04-11 22:30 被阅读0次

    导语

    这是我大四时去面试前端实习工作的时候,某家公司给的笔试题。虽然是挂了,但是也学到了很多。

    题目如标题,实际答案在动物书<<重构Javascript>>中,当时我也没有写过有关卡牌的算法,就随便写了一个从A-K的13张牌的卡组抽取5张出来。毕竟没领会这道题的题意。

    时隔一年,写一下这道题目。

    卡牌

    一副卡牌有 1~K 13张,每张卡牌有四种颜色,分别是 H、S、D、C,我们用 2-H 表示一张牌,则一副完整的卡牌数组应该有52张牌

    可以得到卡牌数组方法为

    function buildCards(){
      const values = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
      const suits = ["H", "S", "D", "C"];
      const cards = []
      values.forEach(value=>{
        suits.forEach(suit=>{
          cards.push(`${value}-${suit}`)
        })
      })
      return cards
    }
    

    接下来,我们写获取随机5张卡牌的方法

    function randomCards() {
      const cardArray = buildCards()
      const cards = []
      const deckSize = cardArray.length
      cards.push(cardArray.splice(Math.floor(Math.random() *deckSize),1)[0])
      cards.push(cardArray.splice(Math.floor(Math.random() *deckSize),1)[0])
      cards.push(cardArray.splice(Math.floor(Math.random() *deckSize),1)[0])
      cards.push(cardArray.splice(Math.floor(Math.random() *deckSize),1)[0])
      cards.push(cardArray.splice(Math.floor(Math.random() *deckSize),1)[0])
      return cards 
    }
    

    注意 : 这里使用了splice方法切割数组,确保随机手牌集合的互异性。

    Math.random

    这个是一个重要的数学方法,用于获取 0~1的随机数,以下是一个常常考的笔试题。

    用 js 实现随机选取 10–100 之间的 10 个数字, 存入一个数组, 并排序。

    Math.random() // 返回0~1的随机数
    Math.random() * 5 // 则返回 0~5的随机数
    // 要想获取某个返回的随机数,可以
    function getRandom(x,y){
      return Math.floor( Math.random() * (y-x+1) + x)
    }
    
    for(var i=0; i<10; i++){
      var result= getRandom(10,100);
      iArray.push(result);
    } 
    iArray.sort();
    

    相关文章

      网友评论

          本文标题:从一副卡牌中随机抽取五张牌,且不能重复

          本文链接:https://www.haomeiwen.com/subject/xzipmhtx.html