-1

I have a two dimensional array 10x10 and I need to know the way to put 20 (-1)s in 20 random cells. Thats my array:

private int[][] array = new int[10][10];
DiVeRsi0n
  • 51
  • 1
  • 12
  • What seems to be the problem? Do you want to know how to generate numbers in certain range, how loops work, how to check current value in array? – Pshemo Mar 29 '14 at 15:38

5 Answers5

2

Pseudo code:

Generate a random number for first index range [0,9]
Generate a random number for the second index range [0,9]
Check if it has already been set:
    if it has repeat until this is false
    if it hasn't, continue below
Set the location
Repeat 19 more times.
clcto
  • 9,530
  • 20
  • 42
  • 1
    Note that this approach works enough fast because the number of random cells you want to fill is relatively smaller compared to the number of cells in the array. This became really inefficient when the number of random cells you want to fill grows. – Alexis C. Mar 29 '14 at 15:46
  • 1
    @ZouZou true, but you could always do the reverse. If you want to set 99 of the 100, set them all and unset one randomly. So the most you would ever have to set is `size/2`. – clcto Mar 29 '14 at 15:58
1

Method randomHashSet() gives you n (20) numbers from 0 to 99. Then you can use easy math trick to map this one-dimension list to two-dimensions array.

Try this code:

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class MyClass {
    static int[][] array = new int[10][10];

    public static void main(String[] args) {
        Set<Integer> numbers = MyClass.randomHashSet(20);

        for (Integer el : numbers) {
            array[el / 10][el % 10] = -1;
        }

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }

    }

    public static Set<Integer> randomHashSet(int n) {
        Set<Integer> set = new HashSet<Integer>();
        Random random = new Random();

        while (set.size() < n) {
            set.add(random.nextInt(100));
        }
        return set;
    }
}
ruhungry
  • 4,506
  • 20
  • 54
  • 98
1
  • Create one dimensional array or even better List which will represent elements from your two dimensional array.
  • Set first 20 elements in list to -1.
  • Shuffle list (Collections.shuffle may be helpful) (now -1 are at random places and you know that there are 20 of them)
  • Put -1 back to two dimensional array. For instance if -1 is at position 23 place -1 in your array at position [2][3] (/10 and %10 may be helpful here).
Pshemo
  • 122,468
  • 25
  • 185
  • 269
0

This post discusses how to get a random number between any two bounds: Java Random number between -100 and 100

The legal array indexes for your 2D-array are between 0 and 9.

So get a random numbers between zero and nine, twice, and use those for the array index. You could get the same set twice, so you may need to keep track of the already-chosen indicies, or if (thatelement == -1) is true, it was already set, so do it again.

To fill all elements with -1, you could use (pre-7) System.arraycopy(o,i,o,i,i) or (7 & 8) Arrays.copyOfRange(i[],i,i).

Community
  • 1
  • 1
aliteralmind
  • 19,847
  • 17
  • 77
  • 108
0
import java.util.Random;

public class ArrayGrid
{
   public static void main(String[] args)
   {  
      int[][] ranAr = new int[10][10];

      // Complete 20 times
      for(int i = 0; i < 20; i++)
      {
         // Get random value between 0-9
         // for the array position
         Random r = new Random();
         int posOne = r.nextInt(10);
         int posTwo = r.nextInt(10);

         // Ensure the position has not already been set
         while(ranAr[posOne][posTwo] == -1)
         {
            posOne = r.nextInt(10);
            posTwo = r.nextInt(10);   
         }

         // Set value to position
         ranAr[posOne][posTwo] = -1;
      }

      // Print the grid to verify
      for(int x = 0; x < 10; x++)
      {
         for(int j = 0; j < 10; j++)
         {
            System.out.printf("%5d ", ranAr[x][j]);
         }
         System.out.println();
      }
   }
}

Output:

    0     0     0    -1     0     0     0    -1     0     0 
   -1    -1     0    -1    -1     0     0    -1     0     0 
   -1     0     0    -1     0     0     0     0     0     0 
    0     0     0     0     0     0     0     0     0     0 
   -1     0     0     0     0     0     0    -1    -1     0 
    0     0     0     0     0     0    -1     0     0     0 
   -1     0     0     0     0     0     0     0     0     0 
    0     0     0     0     0    -1    -1     0     0     0 
    0    -1    -1     0     0     0    -1    -1     0     0 
    0     0     0     0     0     0     0     0     0     0 
JBuenoJr
  • 945
  • 9
  • 14
  • Thank you for that code.It seems working,but why {int posOne = r.nextInt(10-0) + 0;} and not {int posOne = r.nextInt(10);} ??? – DiVeRsi0n Mar 29 '14 at 16:32
  • Opps, yes, that would have been the correct way to write it. r.randInt(10) would have returned 0 to 9. – JBuenoJr Mar 29 '14 at 17:27