Maybe this code that I wrote long time ago (so, the inefficiency is included for free) might be what you're looking for.
circleIntersect[x1_, y1_, r1_, x2_, y2_, r2_] := Module[
{dx, dy, distance},
dx = x1 - x2;
dy = y1 - y2;
distance = Sqrt[dx*dx + dy*dy];
r1 + r2 >= distance
]
theCircle = {{0, 0}, 50};
crit[x1_, y1_, r1_] := Module[{dist},
dist = Sqrt[x1*x1 + y1*y1] + r1;
dist >= theCircle[[2]]
]
newCircle0[] := {{RandomReal[{-50, 50}], RandomReal[{-50, 50}]},
RandomReal[{0.5, 4}]};
newCircle[] := Module[{temp},
While[
temp = newCircle0[];
crit[temp[[1, 1]], temp[[1, 2]], temp[[2]]]
];
temp]
circleList = {newCircle[]};
noList = {};
For[j = 0, j < 10000, j++,
c = newCircle[];
r = Table[
circleIntersect[c[[1, 1]], c[[1, 2]], c[[2]],
circleList[[i, 1, 1]], circleList[[i, 1, 2]],
circleList[[i, 2]]], {i, Length[circleList]}];
If[Count[r, True] > 0,
noList = Append[noList, c],
circleList = Append[circleList, c]];
]
circleList;
Show[{Graphics[Circle[{0, 0}, 50]],
Graphics[
Table[Circle[{circleList[[i, 1, 1]], circleList[[i, 1, 2]]},
circleList[[i, 2]]], {i, Length[circleList]}]]}]
Higher is the value of j in the for-loop, more densely packed will be the circles (and more time it will take).
