【问题标题】:Javascript- Lodash shuffle vs. Math.Random()Javascript- Lodash shuffle vs. Math.Random()
【发布时间】:2017-02-19 11:09:50
【问题描述】:

我正在用 Javascript 编写一个简单的 BlackJack 游戏。到目前为止,我有一个这样的数组:

var deckArray = [ "card1", "card2",...,"card52" ]

我有一个这样设置的“交易”功能:

var deal = function(){
   var card = Math.floor(Math.random() * deckArray.length);
   return deckArray.splice(card,1)[0];
};

既然我已经在使用 Math.random 从deckArray 中随机选择,那么像这样在Lodash 中加入“洗牌”功能对我来说是多余的吗?

var shuffle = function(){
  deckArray = _.shuffle(deckNames);
};

【问题讨论】:

  • 两者都可以。顺便说一句,正如您所学 - 停止使用全局变量并将卡片组作为 deal 函数的参数传递将是一个好习惯。
  • 用字符串表示卡片也很糟糕。字符串是为人类服务的——计算机使用数字。
  • Lodash 的 Fisher-Yates 实现使用 Math.random: github.com/lodash/lodash/blob/master/shuffle.js

标签: javascript random lodash shuffle playing-cards


【解决方案1】:

我想会的。对于真牌,我们将牌组洗牌,然后从牌组顶部挑选一些牌。这就是您可能会使用 shuffle 功能所做的事情,从而对现实世界的使用进行建模。

使用Math.Random(),您可以从未洗牌的牌组中随机挑选一张牌。这里的关键是随机性(顺便说一句,这不是真正随机)。因此,虽然这不是根据真实世界使用建模的,但最终结果是相同的。

我建议使用Math.Random(),因为它会比使用_.shuffle 的(Fisher-Yates)算法更快,虽然不是很明显。

【讨论】:

  • 这听起来有点吹毛求疵,因为它是;但是,我会质疑为什么在这种情况下速度很重要?在我看来,无论使用哪种实现,考虑到这种情况下的使用模式,速度差异绝对是微不足道的。不过,我同意你关于如何洗牌真正的一副牌的其余答案。
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 2016-10-04
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多