如何随机选择两个彼此接近的值

Posted

技术标签:

【中文标题】如何随机选择两个彼此接近的值【英文标题】:How to choose two near each other values randomly 【发布时间】:2022-01-17 10:27:38 【问题描述】:

我有一个函数可以将所有坐标打印到一个列表(列和行)中,其中我有 0 的网格。但是,我想对其进行处理并使用它来随机选择一个在那里生成 1 的位置。我该怎么做它?至于我,列表的输出看起来确实很乱。

代码:

  public static void addNewNum(int[][]grid) 
        List freeSpace = new ArrayList();
        for(int row=0; row< grid.length; row++)  
            for(int col=0; col< grid[row].length; col++) 
                if (grid[row][col] ==0) 
                    freeSpace.add(col);
                    freeSpace.add(row);
                
        
            
            System.out.println(Arrays.toString(freeSpace.toArray()));
         
     
    

作为我的输出:

  1   2   3   4   
  ================
 1| 0 | 0 | 0 | 0 | 
   --+---+---+--
 2| 0 | 0 | 0 | 0 | 
   --+---+---+--
 3| 0 | 0 | 0 | 0 | 
   --+---+---+--
 4| 0 | 0 | 0 | 0 | 
  ================
[0, 0, 1, 0, 2, 0, 3, 0]
[0, 0, 1, 0, 2, 0, 3, 0, 0, 1, 1, 1, 2, 1, 3, 1]
[0, 0, 1, 0, 2, 0, 3, 0, 0, 1, 1, 1, 2, 1, 3, 1, 0, 2, 1, 2, 2, 2, 3, 2]
[0, 0, 1, 0, 2, 0, 3, 0, 0, 1, 1, 1, 2, 1, 3, 1, 0, 2, 1, 2, 2, 2, 3, 2, 0, 3, 1, 3, 2, 3, 3, 3]

列表以 col1,row1,col2,row2,col3,row3 的格式打印...而且我需要以某种方式随机选择靠近其他值的值,这样它们就像一个有效的坐标(我不能选择 col1, col2 或 row2,col3 )也许它做得更容易,我应该创建其他列表,但那是我想出的列表(列表的输出看起来有点奇怪)

所以基本上它应该像这样工作

    带有坐标的生成列表 选择正确的坐标(例如:col2,row2) 将其更改为数组中的值 1

【问题讨论】:

正如您其他问题的答案所说,使用一个类来保存一对坐标。然后在List 中选择一个随机索引并使用这些坐标。 【参考方案1】:

最好构建和使用类型坐标对列表:

public static List<Pair<Integer, Integer>> getEmptyCells(int[][] grid) 
    List<Pair<Integer, Integer>> result = new ArrayList<>();
    for (int i = 0; i < grid.length; i++) 
        for (int j = 0; j < grid[i].length; j++) 
            if (0 == grid[i][j]) 
                result.add(new Pair(i, j));
            
        
    
    return result;

// ....

List<Pair<Integer, Integer>> emptyCells = getEmptyCells(grid);

Random r = new Random();
Pair<Integer, Integer> freeCell = emptyCells.get(r.nextInt(emptyCells.size()));

grid[freeCell.getFirst()][freeCell.getSecond()];

如果配对列表不是选项并且坐标表示为List&lt;Integer&gt;中的问题所示,那么列表的大小总是偶数,因此配对的索引计算为一半list 且在 [0, list.size()/2) 范围内,网格单元格的坐标可以计算为:row = 2 * i; col = 2 * i + 1;,如下图:

public static List<Integer> getEmptyCellPairs(int[][] grid) 
    List<Integer> result = new ArrayList<>();
    for (int i = 0; i < grid.length; i++) 
        for (int j = 0; j < grid[i].length; j++) 
            if (0 == grid[i][j]) 
                result.add(i);
                result.add(j);
            
        
    
    return result;



List<Integer> emptyCellPairs = getEmptyCellPairs(grid);

Random r = new Random();

int pairIndex = r.nextInt(emptyCellPairs.size() / 2);

// free cell
grid[emptyCells.get(2 * pairIndex)][emptyCells.get(2 * pairIndex + 1)];

【讨论】:

问题来了pairIndex通常是超出范围的,我想问下最后一行代码怎么办*你的第二个解决方案 对,应该从emptyCells 列表中检索网格中的相应索引,抱歉。 @Zexxxx,你可以检查更新

以上是关于如何随机选择两个彼此接近的值的主要内容,如果未能解决你的问题,请参考以下文章

用于查找彼此接近的值的 SQL 语句

cheerio - 选择彼此相邻的两个元素

不同对象中具有相同名称的两个变量改变彼此的值

我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?

如何使这两个元素彼此相邻

SwiftUI - 从数据库中随机选择两个值