我需要帮助填充具有特定条件的数组。
我有一个名为array
且尺寸为[2][4]
的2D数组,我需要使用随机int生成器填充1
或2
,我已经这样做了,但是没有检查1或2的限制。说明是这样的:用1或2填充int 2d数组,检查你只能有4次目击,或4次目击2次。
这将是一个空数组示例:
0 0 0 0
0 0 0 0
这是终止程序的一个例子:
1 1 2 2
2 1 2 1
PS:我不完全想要上面的数组,就像那样。
这是我的代码:
public static void generatePositions()
{
int fbuenos = 0; //counts how many 2 there is
int fmalos = 0; //counts how many 1 there is
for (int x = 0; x <= 1; x++)
{
for (int y = 1; y <= 4; y++)
{
int r = randInt(1, 2); //this is a method that return a random int
pos[x][y] = r; //this gives value to the array slot
//how and where do it put the conditions, that's my doubt
}
}
}
答案 0 :(得分:0)
您可以将随机元素的每个实例视为自己的实体。如果你这样做,那么你可以使用更高级的数据结构 - 比如Vector - 来帮助你。
public static void main(String[] args){
Vector<Integer> numbers = new Vector<>();
numbers.add(1);
numbers.add(1);
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(2);
numbers.add(2);
numbers.add(2);
Integer[][] randomInts = new Integer[2][4];
Random rng = new Random(System.currentTimeMillis());
for (int i=0; i<2; i++) {
for (int j=0; j<4; j++) {
int ix = rng.nextInt(numbers.size());
Integer toInsert = numbers.remove(ix);
randomInts[i][j] = toInsert;
}
}
for (Integer[] subArray : randomInts) {
System.out.println(Arrays.toString(subArray));
}
}
实际上,numbers
就像一副纸牌。您使用“卡片”初始化卡片组并随机将它们“交易”到输出数组中。你不能处理不在牌组中的牌,所以如果只有4张1和4张2,那么输出只有4张。
答案 1 :(得分:0)
我喜欢这种问题。据我了解,你不能只生成随机数。相反,在值为1和2的2v4的情况下,您必须创建4个1和4 2的集合或列表,然后随机拉出这些值。这样你就可以保证每个都有4个,即使是随机性。
我创建了一个带三个参数的类。第一个参数是结果数组的宽度。第二个参数是结果数组的高度,第三个参数是您将使用的范围的顶部。
public class RandomFromPool {
public static void main(String[] args)
{
Integer xVal = Integer.parseInt(args[0]);
Integer yVal = Integer.parseInt(args[1]);
Integer maxRandomNumber = Integer.parseInt(args[2]);
RandomFromPool rfp = new RandomFromPool(yVal, xVal, maxRandomNumber);
rfp.generateRandom();
}
private int[][] results;
private Integer maxRandomNumber;
public RandomFromPool(Integer maxY, Integer maxX, Integer maxRandomNumber)
{
results = new int[maxX][maxY];
this.maxRandomNumber = maxRandomNumber;
}
private void generateRandom() {
Random rand = new Random();
//figure out how many of each possible value we want
int neededTotal = results.length * results[0].length;
int totalToGeneratePerVal = neededTotal % maxRandomNumber == 0? neededTotal / maxRandomNumber : neededTotal / maxRandomNumber + 1;
//generate even number of all values
List<Integer> generatedValues = new ArrayList<>(neededTotal);
for(int i = 1; i <= maxRandomNumber; i++)
{
for(int j = 0; j < totalToGeneratePerVal; j++)
{
generatedValues.add(i);
}
}
//grab randomly from the generated values - remove makes sure we only grab each item once
for(int i = 0; i < results.length; i++)
{
for(int j = 0; j < results[0].length; j++)
{
results[i][j] = generatedValues.remove(rand.nextInt(generatedValues.size()));
}
}
//print out the results
for(int i = 0; i < results.length; i++)
{
System.out.println(Arrays.toString(results[i]));
}
}
输入2 4 2产生了这些结果(我跑了三次)
[2, 2, 1, 2]
[1, 1, 1, 2]
and
[1, 2, 2, 1]
[2, 1, 2, 1]
and
[1, 2, 1, 2]
[1, 1, 2, 2]
并输入3 3 3:
[1, 3, 3]
[1, 2, 3]
[2, 1, 2]
and
[1, 1, 2]
[3, 3, 1]
[2, 2, 3]
答案 2 :(得分:0)
一步一步地做好了,这里是任何想要看到它的人的代码:
public static void generatePositions()
{
int fbuenos = 0;
int fmalos = 0;
//generar fantasmas enemigos
for (int x = 0; x <= 1; x++)
{
for (int y = 1; y <= 4; y++)
{
int r = randInt(1, 2);
if (r == 1)
{
if (fmalos >= 4)
{
pos[x][y] = 2;
fbuenos++;
}
else{
pos[x][y] = 1;
fmalos++;
}
}
else{
if (fbuenos >= 4)
{
pos[x][y] = 1;
fmalos++;
}
else{
pos[x][y] = 2;
fbuenos++;
}
}
}
}
}