我正在创建一个程序,其中包含一副牌的双数组列表。有两个“手”将从这一个牌组中处理。必须将5张独特的牌发给“comHand”,这是一个存储5张牌的双阵列。第一个[]存储正在处理的卡片的迭代(第一张卡片,第二张卡片等)和第二张[]存储[0]中卡片的套装和[1]中卡片的编号。
我简化了我的代码以确保获得3个独特的抽奖。只有一件西装和3种可能的数字可供选择。我的代码在///之上正常工作(两个数字总是唯一的)。但是,下面的代码有时不会产生唯一的数字。我可以帮助辨别为什么会这样吗?
int comHand [][] = new int [5][2];
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);
comHand[0][0] = card1;
comHand[0][1] = card2;
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);
while (card1 == comHand[0][0] && card2 == comHand[0][1]){
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);}
comHand[1][0] = card1;
comHand[1][1] = card2;
///
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);
while (card1 == comHand[0][0] && card2 == comHand[0][1]){
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);}
while (card1 == comHand[1][0] && card2 == comHand[1][1]){
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);}
comHand[2][0] = card1;
comHand[2][1] = card2;
答案 0 :(得分:1)
int comHand [][] = new int [5][2];
ArrayList<Integer> cards = new ArrayList<Integer>();
int totalCards = 52; //Cards in a pack
for(int x = 1; x <= totalCards; x++)
{
cards.add(x);
}
//Repeat for 5 cards
for(int y = 0; y < 5; y++)
{
int selectCard = (int)(Math.random()*cards.size()-1);
comHand[y][0] = cards.get(selectCard) % 13; //13 cards per suit
comHand[y][1] = cards.get(selectCard) / 13;
cards.remove(selectCard);
}
希望这就是你所追求的。
答案 1 :(得分:1)
您的while循环似乎有错误的条件。试试||而不是&amp;&amp;:
while (card1 == comHand[0][0] || card2 == comHand[0][1]) {
card1 = (int) (Math.random()*1);
card2 = (int) (Math.random()*3);
}
我会尝试另一种方法,因为“重复Math.random()直到一切正常”并不是一个好的算法。很难预测算法需要完成多少步骤(以及它是否总能完成)。
使用卡片而不是int数组。使用Math.random(或Random)从集合中选择卡片,然后从该集合中删除所选的卡片。这样它就不会再次被选中。或者建造一个甲板,将其洗牌,然后从甲板上弹出顶牌直到完成。这很容易实现。
答案 2 :(得分:0)
通过使用随机获取连续绘制中的唯一性,您无法确定。 维护一个数组,存储一个事务的绘制,如果你得到数组中的任何绘制,继续生成一个新的随机数