【问题标题】:Check if Array Positions produced by random are the same检查随机产生的数组位置是否相同
【发布时间】:2026-01-03 09:35:05
【问题描述】:

我做了一个从二维数组中选择随机位置的命令

int[][] nums= {{1,2,3},
            {2,3,4},
            {5,6,7}};

for(int i = 0; i < 5; i++) {
        int num = nums[rand.nextInt(4)][rand.nextInt(4)];
        System.out.println(num);
    }

如何确保当 int num 第一次选择一个位置时, 它永远无法再次选择它? 使 5 个随机数彼此不同。

【问题讨论】:

  • 您可以在每次选择它时从数组中删除它吗?
  • 顺便说一句:nums[rand.nextInt(4)] 可能会导致 nums[3] 这将导致 ArrayIndexOutOfBoundsException 因为长度为 3 的数组将没有任何索引为 3 的元素(只有 0、1 和 2 )
  • 虽然看着这个任务,我对你实际上想要做什么感到很困惑。为什么需要将它保存在数组内部的数组中?为什么不只拥有一个包含所有数字的数组({1,2,3,4,5,6,7,8,9})?当你这样做时 -> nums[rand.nextInt(4)][rand.nextInt(4)] 你可以很容易地得到一个空指针。所以你可能想考虑一下这个。
  • @OHGODSPIDERS 写的评论和你发布的一样:D
  • 好的,谢谢大家

标签: java multidimensional-array


【解决方案1】:

如果您需要它从 2d 表格中选择每个数字一次,这将起作用。 我创建了另一个列表,描述了表中的可用位置。然后当我们使用它们时,将它们从可用位置列表中删除。因为您使用的是二维数组,所以我使用的是点类。

必需的进口

import java.util.*;
import java.awt.*;
        Random rand = new Random();
        int[][] nums= {{1,2,3},
                    {4,5,6},
                    {7,8,9},
                    {10,11,12}};
        
        ArrayList<Point> availableLocations = new ArrayList<Point>();
        for(int i = 0;i<nums.length*nums[0].length ;i++) availableLocations.add( new Point(i%nums[0].length,i/nums[0].length ));
        
        for(int i = 0; i < 12; i++) {
            int randomIndex = rand.nextInt(availableLocations.size());
            Point location = availableLocations.get(randomIndex);
            
            int num = nums[location.y][location.x];
            System.out.println(num);
            
            availableLocations.remove(randomIndex);
        }

【讨论】:

  • 我怎样才能用普通数组做到这一点?
  • 您必须将“Point”替换为“Integer”,它可以在相同的主体上工作。 availableIndexes 的初始化只是从 0 到数组大小。