繁体   English   中英

Java - 5x5 数组中的随机数字

[英]Java - random digits inside an array of 5x5

int[][] array = new int[5][5];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            System.out.print(1);
        }
        System.out.println();
    }

大家好,我有这个打印 5x5 1 的数组

11111
11111
11111
11111
11111

我想要做的是将这些 1 中的三 (3) 个随机设为 0。 例子

11101
11111
11011
10111
11111

我怎么做? 先感谢您!

对于随机的东西,你可以使用Math.random() 它返回一个介于 0 包含和 1 排除之间的随机双精度值。 你可以这样做:

int w = 5, h = 5;
int[][] array = new int[w][h]; 
for (int i = 0; i < w; i++) { 
  for (int j = 0; j < h; j++) {  
    array[i][j] = 1;
  }  
}
for (int c = 0; c < 3; c++) {
  int i, j;
    do {
      int index = (int)(Math.random() * w * h);
      i = index / w;
      j = index % w;
    } while (array[i][j] == 0);
    array[i][j] = 0;
  }

仅当 0 的数量与数组的总大小相比较低时,此解决方案才可接受。 如果 0 的数量太高,此代码将非常低效,因为我们将随机搜索值 1

您必须首先用 1s 初始化数组:

int[][] array = new int[5][5];
for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        array[i][j] = 1;
    }
}

然后在 3 个随机位置设置 0:

Random random = new Random();
int a = 0;
while (a < 3) {
    int i = random.nextInt(array.length);
    int j = random.nextInt(array[0].length);
    if(array[i][j] != 0) {
        array[i][j] = 0;
        a++;
    }
}

使用这种方法,数组中的每个条目都有相同的机会变成 0。最后你应该打印数组:

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        System.out.print(array[i][j]);
    }
    System.out.println();
}

这是一个稍微不同的有趣解决方案。 创建一个数字从 0 到 24 的列表,打乱列表并从中选取前 3 个元素来更新二维数组。 数字序列意味着数组中不相同的位置将被多次设置为 0。

List<Integer> sequence = IntStream.rangeClosed(0, 24)
    .boxed()
    .collect(Collectors.toList());

Collections.shuffle(sequence);

for (int i = 0; i < 3; i++) {
    int value = sequence.get(i);
    int row  = value / 5;
    int  column = value % 5;

    array[row][column] = 0;
}

生成序列的代码来自这个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM