我正在尝试使用特定数量的元素创建一个20x20 Char 2D-Array。例如, A x 20 B X 10 C是剩下的。
在20x20网格周围随机放置20个随机放置的20个随机放置在20x20网格周围,并用C填充所有空白空间。
我正在尝试使用Math.random()来实现这一点,但似乎无法实现。
package quest;
import java.util.*;
public class Quest
{
public static void main(String[] args)
{
char [][] board = new char [20][20];
int j = 0;
for(int x = 0; x < 20; x++)
{
for(int y = 0; y < 20; y++)
{
for(int a = 0; a < 20; a++)
{
int chances = (int)(Math.random()*20)+1;
if (chances == 1)
{
board[x][y] = 'A';
}
}
for(int b = 0; b < 10; b++)
{
int chances = (int)(Math.random()*20)+1;
if (chances == 1)
{
board[x][y] = 'B';
}
if(board[x][y] == 0 )
{
board[x][y] = 'C';
}
}
System.out.print(board[x][y]+" ");
}
System.out.println();
}
}
}
答案 0 :(得分:2)
此解决方案生成一系列400(= 20 x 20
个)唯一随机数,范围从0到399,覆盖20 x 20
网格中的每个插槽。然后随机填充20个As,10个B和其余的Cs。
使用Math.random
的问题在于您冒着多次生成相同随机数的风险。更好的方法是在覆盖2D阵列中每个槽的一系列数字上使用Collections.shuffle()
。
int WIDTH = 20;
int HEIGHT = 20;
char[][] array = new char[WIDTH][HEIGHT];
// generate a random sequence of 400 (= 20 x 20) unique numbers
ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < WIDTH*HEIGHT; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
// add 20 randomly placed As
for (int i=0; i < 20; ++i) {
int r = numbers.get(i) / WIDTH;
int c = numbers.get(i) % HEIGHT;
array[r][c] = 'A';
}
// add 10 randomly placed Bs
for (int i=20; i < 30; ++i) {
int r = numbers.get(i) / WIDTH;
int c = numbers.get(i) % HEIGHT;
array[r][c] = 'B';
}
// fill the rest with Cs
for (int i=30; i < WIDTH*HEIGHT; ++i) {
int r = numbers.get(i) / WIDTH;
int c = numbers.get(i) % HEIGHT;
array[r][c] = 'C';
}
答案 1 :(得分:0)
您可以简单地生成一个随机数,如果它小于0.5,则指定A
,否则指定B
。然后,您将生成另一个随机数以确定该字母的位置。如果已经采用了该位置,则生成另一个位置,依此类推。
当你用完一封信时,你已经分配了20 A
个,你只需随机生成该位置并将B
分配到该位置。
完成后,您将简单地遍历数组,如果找到任何空格,则指定C
。
答案 2 :(得分:0)
在这里,我向您展示如何添加As。对于Bs你也是这样做的。对于Cs,您只需通过您的电路板并将Cs插入空单元格。
char[][] board = new Char[20][20];
//Place As
for (int i = 1; i <= 20; i++) { //20 As
int randX = (int) (Math.random() * 20); //random number between 0-19
int randY = (int) (Math.random() * 20);
while (board[randX][randY] != null) { //find a free cell
randX = (int) (Math.random() * 20);
randY = (int) (Math.random() * 20);
}
board[randX][randY] = 'A'; //insert A
}
另一种选择是先用Cs填充电路板,然后如果电池中有C则插入As和Bs。为此,您必须将board[randX][randY] != null
更改为board[randX][randY] != 'C'
答案 3 :(得分:0)
您可以将20x20 2D阵列视为400个元素的1D阵列。使用一点数学运算,您可以获得应该放置值的坐标。之后,您可以为将放置A和B字符的位置生成随机数。您必须检查以确保不会覆盖已设置的A或B字符。
final char[][] matrix = new char[20][20];
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
matrix[i][j] = 'c';
}
}
final Random random = new Random();
for (int i = 0; i < 20; i++) {
while(true) {
int position = random.nextInt(400);
if (matrix[position / 20][position % 20] == 'c') {
matrix[position / 20][position % 20] = 'a';
break;
}
}
}
for (int i = 0; i < 10; i++) {
while(true) {
int position = random.nextInt(400);
if (matrix[position / 20][position % 20] == 'c') {
matrix[position / 20][position % 20] = 'b';
break;
}
}
}