我有一个52张牌(13x4)的阵列(cards
)和另外25张牌(5x5)的阵列(cardsOut
)。我想随机将52张卡中的元素复制到25张卡片中。
另外,我不想在5x5阵列中有任何重复。所以这就是我所拥有的:
double row=Math.random() *13;
double column=Math.random() *4;
boolean[][] duplicates=new boolean[13][4];
pokerGame[][] cardsOut = new pokerGame[5][5];
for (int i=0;i<5;i++)
for (int j=0;j<5;j++){
if(duplicates[(int)row][(int)column]==false){
cardsOut[i][j]=cards[(int)row][(int)column];
duplicates[(int)row][(int)column]=true;
}
}
此代码中存在2个问题。首先,行和列的随机值仅生成一次,因此每次都将相同的值复制到5x5数组中。由于每次都复制相同的值,我不确定我的重复检查器是否非常有效,或者它是否有效。
我该如何解决这个问题?
答案 0 :(得分:7)
我首先建议使用shuffling套牌,然后选择要放入5x5阵列的前25张牌。试图混合这两个步骤是不必要的复杂化。
如果您需要针对性能进行优化(您可能不需要),那么值得注意的是,您可以使用Fisher-Yates shuffle并在选择前25张随机卡后停止算法,而不会对剩余的卡进行洗牌
答案 1 :(得分:5)
我认为你的方法比实际应用更困难。尝试使用名为card的类和两个集合 - 一个名为CardsRemaining,另一个名为CardsUsed。
最初,CardsRemaining包含所有52个卡对象,而CardsUsed为空。随着卡被添加到CardsUsed,它们将从CardsRemaining中删除,自然会防止重复发生。
您的程序最终可能会看起来像这样(抱歉,它在c#中):
class Program
{
static void Main(string[] args)
{
List<Card> CardsRemaining=new List<Card>();
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 4; j++)
{
Card c = new Card(i, j);
CardsRemaining.Add(c);
}
}
List<Card> CardsUsed = new List<Card>();
for(int i=0;i<25;i++)
{
int cardIndex = getRandomNumber(CardsRemaining.Count);
Card c = CardsRemaining[cardIndex];
CardsRemaining.Remove(c);
CardsUsed.Add(c);
}
}
}
class Card
{
public int Number;
public int Color;
public Card(int number, int color)
{
this.Number = number;
this.Color = color;
}
}