Sno*_*man 5 java random duplicates
我有一个cards52(13x4)的数组(cardsOut)和另外25个卡(5x5)的数组().我想随机将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;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码中有2个问题.首先,行和列的随机值仅生成一次,因此每次都将相同的值复制到5x5数组中.由于每次都复制相同的值,我不确定我的重复检查器是否非常有效,或者它是否有效.
我该如何解决?
我建议先将牌组改组,然后选择前25张牌放入5x5阵列.试图混合这两个步骤是不必要的复杂性.
如果您需要针对性能进行优化(您可能不需要),那么值得注意的是,您可以使用Fisher-Yates shuffle并在选择前25张随机卡后停止算法,而不会对剩余的卡进行洗牌.
我认为你的方法使它比应该更难.尝试使用名为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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |