Другой подход, чтобы заполнить сетку с 3 случайных O
с бы сделать это прямо при инициализации:
int numOs = 3;
for(int row = 0; row<grid.length; row++) {
for(int col = 0; col<grid[row].length; col++) {
if(numOs > 0 && randomConditionForO()) {
grid[row][col] = 'O';
numOs--;
} else {
grid[row][col] = 'N';
}
}
}
randomConditionForO()
мог что-то вроде rn.nextInt() % 2 == 0
и т. д. Если вы хотите обеспечить вероятность установки O, скажем, 25%, вы можете использовать что-то вроде rn.nextInt(100) < 25
или rn.nextFloat() < 0.25f
.
Проблема здесь, однако, заключалась бы в том, что вы могли получить меньше 3-х из-за случайности от состояния, чтобы вы могли противостоять этому. Один из способов может состоять в том, чтобы обеспечить подсчет для Ns и увеличить вероятность для O соответственно.
Пример:
int numOs = 3;
int numNs = gridSize - numOs; //gridSize would be 3x3 = 9 in your example
for(int row = 0; row<grid.length; row++) {
for(int col = 0; col<grid[row].length; col++) {
if(numOs > 0 && rn.nextInt(numNs + 1) < numOs) {
grid[row][col] = 'O';
numOs--;
} else {
grid[row][col] = 'N';
numNs--;
}
}
}
Здесь rn.nextInt(numNs + 1) < numOs
будет означать, что вероятность выбрал O увеличивается с каждым выбранным N и уменьшается с каждым выбранным O. Так как nextInt(bound)
будет возвращать целое число в диапазоне от 0 (включительно) и bound
(эксклюзив), мы должны пройти в numNs + 1
, так что, если больше нет доступных Ns, мы используем границу 1, и поскольку она является эксклюзивной, мы всегда будем получать 0, что меньше numOs
, пока существуют Os (при этом получается 100 % вероятности).
Если вы хотите заменить 3 ячейки в сетке, почему вы используете вложенные циклы вообще? Достаточно всего одного цикла, т. Е. Петли до тех пор, пока вы не установите 3 Os, например. путем выборочного выбора, проверяя, содержит ли он что-то другое, кроме O, а затем устанавливает его, а если он содержит O, вы принимаете еще один, пока не установите 3 Os. Конечно, это может занять много времени, если будут выбраны одни и те же ячейки, чтобы вы могли отслеживать те, которые все еще доступны. – Thomas
@john - это ошибка на вашем лимите в вашей внутренней петле. Эта работа фактически, потому что у вас одинаковое количество строк, чем столбцы. вы должны проверить col против 'grid [row] .length'. И ответ @Eran - хороший – neomega
Обратите внимание, что изменение названия вашего вопроса на 'closed thread-resolved' не является приемлемым способом, чтобы отметить, что на ваш вопрос был дан ответ. Если у вас есть ответ, который вы искали, вы должны отметить этот ответ как принятый (щелкните галочку рядом с ним). – Eran