当前位置: 首页 > 知识库问答 >
问题:

我如何打印出一个随机的二维数组而不重复?

鲜于璞瑜
2023-03-14

我的CompSci课程有一个作业,我们正在做,我们必须打印出一副二维的卡片,6行8列的数组。每个“卡”基本上是随机生成的数字(1-12)和随机选择的套装(钻石、红桃、黑桃、,

static Random random = new Random(1234567);

static int i = 1;

static int a;
static int d;

static List<String> suits = new LinkedList<String>();

static List<String> cards = new LinkedList<String>();

static int[][] grid = new int[6][8];

public static void main(String[]args)
{
    suits.add("Diamonds");
    suits.add("Clubs");
    suits.add("Hearts");
    suits.add("Spades");

    cards.add("1");
    cards.add("2");
    cards.add("3");
    cards.add("4");
    cards.add("5");
    cards.add("6");
    cards.add("7");
    cards.add("8");
    cards.add("9");
    cards.add("10");
    cards.add("11");
    cards.add("12");

    drawGrid();
}
private static void drawGrid()
{
    for(int b = 0; b < grid.length; b++)
    {
        for(int c = 0; c < grid[i].length; c++)
        {
            a = (int)(Math.floor(suits.size() * Math.random()));
            d = (int)(Math.floor(suits.size() * Math.random()));

            System.out.print(" |" + cards.get(d) + " " + suits.get(a) + "|");

            Collections.shuffle(suits);
            Collections.shuffle(cards);
        }
        System.out.println();
    }
}

共有3个答案

南门茂才
2023-03-14

创建一个变量来记住一张牌是否已经抽出

static boolean[][] drawn = new boolean[4][13];

然后用以下内容替换您绘制卡片的位:

do {
    a = (int)(Math.floor(suits.size() * Math.random()));
    d = (int)(Math.floor(cards.size() * Math.random()));
} while (drawn[a][d]);
drawn[a][d] = true;

最后,删除您正在洗牌的两行。Math.random会给你一张随机卡。

        Collections.shuffle(suits);
        Collections.shuffle(cards);
江阳夏
2023-03-14

你能做的就是把你以前选过的卡片存放在某个地方,这样你就不会有重复的卡片了。我相信这将有助于:

创建一个集合,将其称为selectedCardMap:

static Set<String> selectedCardMap = new HashSet<String>();

让我们替换这两行代码:

a = (int)(Math.floor(suits.size() * Math.random()));
d = (int)(Math.floor(suits.size() * Math.random()));

对于一个方法,它会给你一个新的未使用的卡,让我们调用这个方法getNewCard,在里面,创建相同的随机数,你试图得到,但这一次,在我们得到它,我们检查卡是否被选中,如果它是,然后重复并再次检查,直到我们得到一个未选择的,像这样:

public static String getNewCard() {

while (true) {
    int a = (int)(Math.floor(suits.size() * Math.random()));
    int d = (int)(Math.floor(suits.size() * Math.random()));

    //Make a key for the map
    String key= d+"-"+a;


    //check if it was selected
    if (!selectedCardMap.contains(key)) {
       //This card is available, add it to selected and return it!
       selectedCardMap.add(key);
       return " |" + cards.get(d) + " " + suits.get(a) + "|";     
    }
  }
}

在这之后,继续你所做的一切!,对不起,如果有任何代码错误,我只是写了这个没有编译它。但这是代码的主要思想。希望您能理解,并对您有所帮助。。

盖泽宇
2023-03-14

有不同的方法可以做到这一点。我的第一个想法是创建一个int数组列表。

    ArrayList<int[]> list = new ArrayList<int []> ();

    for (int i=0; i<suits.size(); i++)
    {
        for(int j=0; j<cards.size(); j++)
        {
            int[] card = {i,j};
            list.add(card);
        }
    }

    Collections.shuffle(list);

现在每个元素都代表一张牌。在前6个元素中,你有6张随机卡片。元素[0]=套装和元素[1]=卡号

 类似资料:
  • 我试图打印每个单词的第一个字符放入一个二维数组。我得到一个错误,当我试图打印它的子串。 我得到一个不可编译的源代码错误。

  • 我正在尝试编写一个程序,打印一个2d数组,其中包含100-10000范围内的随机数,并打印出数组中的最大值、平均值和最小值。该程序将询问用户行数和列数,并在该数组中打印随机数。 这是我的代码:

  • 问题内容: 我对Swift和编程逻辑很陌生,所以请耐心等待 如何在Swift中生成0到9之间的随机数而不重复最后生成的数字?因为相同的数字不会连续出现两次。 问题答案: 将先前生成的数字存储在变量中,然后将生成的数字与先前的数字进行比较。如果它们匹配,则生成一个新的随机数。重复生成新数字,直到它们不匹配为止。

  • 问题内容: 我对二维数组有问题。我有这样的显示: 我基本上想要显示为: 这是我的代码: 问题答案: 输出量 当然,您可以像其他答案中提到的那样交换7和5,以获得每行7。

  • 有没有一种方法可以让你使用打印给定数组中的元素? 所以输出将是 或者 或

  • 问题内容: 我知道如何对一维字符串数组执行此方法,但是如何打印二维数组?使用1D时,我是这样进行的: 如何打印2D阵列? 问题答案: 您只需对元素进行两次迭代: 重要提示: 也很有用,因为您可以链接操作,例如:因为它返回对self的引用!如果可以的话,使用晕厥糖。 重要事项2: 由于在这种情况下,您计划向其添加许多内容,因此最好估算一下避免在添加过程中多次分配和重新定位数组的能力,因此您可以执行以