【问题标题】:In java Most simple way to add non duplicate random numbers to 2D Array在java中将非重复随机数添加到二维数组的最简单方法
【发布时间】:2019-11-09 13:17:41
【问题描述】:

我正在尝试找出最简单的方法来添加仅用非重复数字填充此 2D 数组。

我尝试使用带布尔值的方法在添加之前检查值,如果它已经存在但我无法使其工作。

int[][] x = new int[R][C];

for (int i = 0; i < x.length; i++) {
    for (int j = 0; j < x[i].length; j++) {
        double z = (Math.random() * ((30 * (j + 1)) - ((30 * j) + 1)) + 1 + ((30 * j) + 1));
        card[i][j] = (int) z;
    }
}

【问题讨论】:

标签: java arrays duplicates numbers 2d


【解决方案1】:

我要说的最好的方法是使用Set 数据结构

int row = 2;
int col = 2;
Set<Set<Integer>> rowSet = new HashSet<>();

 for (int i = 0; rowSet.size() < row; i++) {
        Set<Integer> colSet = new HashSet<>(); 

    for (int j = 0; colSet.size() < col; j++) {
    double x = (Math.random() * ((15 * (j + 1)) - ((15 * j) + 1)) + 1 + ((15 * j) + 1));
    colSet.add((int) x);
  }
   rowSet.add(colSet);
}

最后将它们转换为数组

int[][] arr = set.stream()
                     .map(i->i.stream()
                             .mapToInt(Integer::intValue)
                             .toArray())
                     .toArray(int[][]::new);

【讨论】:

    【解决方案2】:

    您肯定想使用Random.nextInt() 来获得int 的均匀分布。您很可能需要Set 来跟踪已生成的号码。

    int[][] cards = new int[ROW][COL];
    Random r = new Random();
    Set<Integer> generated = new HashSet<>();
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
        int n;
        do {
          n = r.nextInt();
        } while (generated.contains(n));
        generated.add(n);
        cards[i][j] = n;
      }
    }
    

    【讨论】:

    • 那么它不再是随机的了。问题是关于使用随机数。
    猜你喜欢
    • 2014-11-19
    • 2017-06-22
    • 2014-07-29
    • 1970-01-01
    • 2021-11-28
    • 2020-04-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多