在随机位置用零填充数组
Fill array with zero in random places
所以,我想要做的是在特定次数的随机位置用零填充二维数组。假设它必须是 90 个位置的数组中的 20 个零。到目前为止我所做的是声明一个二维数组并用随机数填充它。我的下一个想法是简单地选择随机位置并将它们替换为零。知道我该怎么做吗?
int[][] myboard = new int[9][9];
for (int i = 0; i < myboard.length; i++) {
for (int j = 0; j < myboard[i].length; j++) {
myboard[i][j] = (int) (Math.random() * 10);
}
}
伪代码如下所示:
while (num_zeros_filled < 20):
row = random()%total_rows
col = random()%total_cols
if (arr[row][col] == 0): # already filled in with 0
continue
else:
arr[row][col] = 0
num_zeros_filled += 1
然而,如果只生成那些已经填充了 0 的单元格,这在理论上可能会花费无限的时间。更好的方法是将二维数组映射到一维数组,然后采样仅从那些尚未填充 0 的单元格中输出。
这是实现目标的一种相当简单的方法,但它应该可以完成工作。所以你需要得到每一行的长度。完成后,您可以调用一个函数,该函数会在某个起点和行的长度之间为您提供一个随机数。下面是一些代码示例,向您展示我的意思:
import java.util.concurrent.ThreadLocalRandom;
import java.util.Arrays;
public class Example {
public static void main(String []args) {
int[][] myboard = new int[9][9];
for (int i = 0; i < myboard.length; i++) {
for (int j = 0; j < myboard[i].length; j++) {
// fill the row with random vals
myboard[i][j] = GetRandomNumber(0, myboard[i].length);
}
// sneak as much zeros as your heart content
int random = GetRandomNumber(0, myboard[i].length);
myboard[i][random] = 0;
}
System.out.println(Arrays.deepToString(myboard));
}
private static int GetRandomNumber(int min, int max) {
/*
min is the start point
max is the curr row len
*/
return ThreadLocalRandom.current().nextInt(min, max);
}
}
所以,我想要做的是在特定次数的随机位置用零填充二维数组。假设它必须是 90 个位置的数组中的 20 个零。到目前为止我所做的是声明一个二维数组并用随机数填充它。我的下一个想法是简单地选择随机位置并将它们替换为零。知道我该怎么做吗?
int[][] myboard = new int[9][9];
for (int i = 0; i < myboard.length; i++) {
for (int j = 0; j < myboard[i].length; j++) {
myboard[i][j] = (int) (Math.random() * 10);
}
}
伪代码如下所示:
while (num_zeros_filled < 20):
row = random()%total_rows
col = random()%total_cols
if (arr[row][col] == 0): # already filled in with 0
continue
else:
arr[row][col] = 0
num_zeros_filled += 1
然而,如果只生成那些已经填充了 0 的单元格,这在理论上可能会花费无限的时间。更好的方法是将二维数组映射到一维数组,然后采样仅从那些尚未填充 0 的单元格中输出。
这是实现目标的一种相当简单的方法,但它应该可以完成工作。所以你需要得到每一行的长度。完成后,您可以调用一个函数,该函数会在某个起点和行的长度之间为您提供一个随机数。下面是一些代码示例,向您展示我的意思:
import java.util.concurrent.ThreadLocalRandom;
import java.util.Arrays;
public class Example {
public static void main(String []args) {
int[][] myboard = new int[9][9];
for (int i = 0; i < myboard.length; i++) {
for (int j = 0; j < myboard[i].length; j++) {
// fill the row with random vals
myboard[i][j] = GetRandomNumber(0, myboard[i].length);
}
// sneak as much zeros as your heart content
int random = GetRandomNumber(0, myboard[i].length);
myboard[i][random] = 0;
}
System.out.println(Arrays.deepToString(myboard));
}
private static int GetRandomNumber(int min, int max) {
/*
min is the start point
max is the curr row len
*/
return ThreadLocalRandom.current().nextInt(min, max);
}
}