使用具有最大目击数的随机整数填充数组

时间:2016-08-09 23:09:39

标签: java arrays

我需要帮助填充具有特定条件的数组。

我有一个名为array且尺寸为[2][4]的2D数组,我需要使用随机int生成器填充12,我已经这样做了,但是没有检查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
        }
    }        
}

3 个答案:

答案 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++;
                }
            }

        }


    }
}