如何在不重复的情况下混合JavaScript数组中的值?

时间:2013-09-19 11:54:02

标签: javascript

我正在尝试创建一个JavaScript卡片游戏,并且想要选择5张卡而不重复:

var colors = ["hearts", "spades", "diamonds", "clubs" ];
var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

color = colors[parseInt(Math.random()*colors.length,10)]
value = values[parseInt(Math.random()*values.length,10)]

如果我挑选5张牌,怎样才能确保没有重复?

3 个答案:

答案 0 :(得分:10)

准备一张包含所有48张牌的阵列(你缺少Aces吗?)

每次选择卡片时,请将其从阵列中移除。

下一次抽奖将来自简化数组,因此不会有重复数据。

替代:

从同一个数组开始,然后是shuffle it。拿前五张牌。

答案 1 :(得分:3)

您还可以创建一个标记列表,放入已使用过的卡片!

var myGivenCards = {}

为每张卡重复一次:

color = colors[parseInt(Math.random()*colors.length,10)]
value = values[parseInt(Math.random()*values.length,10)]
if (typeof(myGivenCards[color+values])==='undefined') {
  //not used
  myGivenCards[color+values] = true;
}

答案 2 :(得分:2)

正如其他人所说,使用Fisher-Yates-Shuffle,然后选择前五个:

 var colors = ["hearts", "spades", "diamonds", "clubs"];
 var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

 // from http://jsfromhell.com/array/shuffle by Jonas Raoni Soares Silva
 function shuffle(o) { //v1.0
     for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
     return o;
 };

 var cards = [];
 for (var j = 0; j < colors.length; j++) {
     for (var i = 0; i < values.length; i++) {
         cards.push(colors[j] + values[i]);
     }
 }
 shuffle(cards);
 console.log(cards.slice(0, 5));