Why a 2D array? I would use an ArrayList of PVector to hold the coordinates of the created circles. Mmm, need actually a full class to keep size too, or store it in the z part of the PVector.
But let's keep it simple, we can go back to the above solution later.
One solution I am not fond of, but which is quite simple, is to have three arrays.
Say you will have 100 circles. You make three arrays of ints or floats, of this size.
Let's define a maximum size (radius) for the circles, say MAX_SIZE = 20
Then on each frame (in draw()), you take three random numbers: one between MAX_SIZE and width - MAX_SIZE (that's the x coordinate), another between MAX_SIZE and height - MAX_SIZE (y) and one between 0 and MAX_SIZE (radius).
Iterate on the previously created circles (maintain a variable to hold the number of created circles): for each one, see if dist(x2 - x1, y2 - y1) is below the sum of the two radius. If so, there is a risk of overlap. You can reduce the size of the generated circle, or just redraw numbers and do again (in a loop). If not, no overlap, add the circle at the end of the others.
When generated, iterate again on the circles and draw them.
Wew, it takes longer to describe than to write the code!
Try, and come back if you have issues.