在Javascript中使用modulo理解函数

时间:2013-06-04 20:38:04

标签: javascript modulo

我昨天有一个用户在这里编写了这段代码,我很难理解它。我理解所有交易功能的第9行,它创建了52个数字中的随机卡,但在下一行我不明白这是做什么的。有人可以解释这段代码的作用,以便我可以对其进行修改并对其进行扩展吗?

//Creates the deck
var Ace = 1;
var Face = 10;
var deck = [Ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, Face, Face, Face];
/*Creates a deal function that can deal cards to each player. 
Use object_name.property_name = deal() to call this function.*/
var deal = function () {
    var randomcard = Math.ceil(Math.random() * 52) + 1;
    return deck[Math.floor(randomcard % 13)];
};

4 个答案:

答案 0 :(得分:0)

牌组中有52张牌。 13种不同的价值,有4种不同的套装(球杆/钻石......)。注4 * 13 = 52.模数13只是为了确保挑选出甲板变量中的一个值,并忽略该套期。

答案 1 :(得分:0)

你有一个只有13项的阵列 - 卡片。 0到12。

如果你取任何数字% 13,你将总是得到0到12之间的值 - 该数字的除法的余数除以13.然后基本为% 13将套牌从套装+卡减少到卡片。

这可能同样写为Math.ceil(Math.random() * 13) + 1而不是52.但是如果代码需要扩展到也适合,那么你很可能

答案 2 :(得分:0)

好吧,首先让我们更正代码。原始代码确实给你一个工作结果,但它以一种令人困惑的方式做到了。它不会选择介于0和51之间的值,这是自然而然的事情,它会选择介于2和53之间的值。(结果仍然可用于获取0到12之间的值以用于值,但是获得卡的诉讼并不是很直接。)

var randomcard = Math.floor(Math.random() * 52);
return deck[randomcard % 13];

模运算符从分区获取提醒,因此表达式的结果将获得卡的值。最多12个返回数字本身,然后在13再次从0开始。


要获取卡片套装的索引,您可以使用Math.floor(randomcard / 13)。使用原始随机值(2到53),您需要使用(Math.floor(randomcard / 13) % 4)代替。

答案 3 :(得分:0)

代码只有一半有效。模数很难选择从牌组中抽出的牌的类型,但不是牌的牌。此外,该代码并未说明已经发出特定卡(它从未从卡组中删除),因此多个玩家可以拥有相同的卡。

有关甲板结构在JavaScript中的外观的信息,请参阅此页面:

http://www.brainjar.com/js/cards/default2.asp