Randomly populating procedural shape (or Image Texture) in Cycles
The solution I am proposing is very similar to that proposed by Rich Sedman. But it is more automated and I believe gives more natural results. The final result is:



The main idea is to compute multiple layers of scattered non-intersecting objects and then combine them at the end using some methods that we shall discuss forming a random intersecting scattered objects.

I would like you to study this article first as we will be using concepts discussed in it: Introduction To Texture Mapping



First, we use modulo to create a grid sub-coordinates plane, if you use the output as the coordinates for some image texture or a procedural texture, you will see the shape repeated on the grid:



By flooring the result of the multiplication of the coordinates with the value, and evaluating noise at the output, we get constant random value for each cell. Floor is performed by rounding after subtracting $0.5$.



Assuming the absolute of the bounding locations of the computed shape will never exceed one in all axis, we can scale the sub-coordinates by dividing them by the random values we computed. The random values has to be between zero and one so as not to get too big and become out of the bound of its cell.



We now move each of the sub-coordinates by some random amount putting in consideration not to move it too far so as to keep it in bound. Since we know the maximum scale of each shape (The random values used for scale), we know our translation limits, smaller shapes have more freedom while bigger shapes don't, the limiting equation can be derived by looking at this illustration:



Lets say we have a frame with width $200$ and a box with width $25$, how many steps can we move the box such that it touched the edge? We can count $7$ in this case, which is the ratio between the frame width and the box width minus 1, that is, $\frac{200}{25}-1=8-1=7$. So by applying this in our node tree:



Then we perform random rotation, using yet another noise output multiplied by $2\pi$ used as the angle of rotation, you already know how to perform the rotation, so I shall not show it here:



Even though we randomized every transformation, it still doesn't look very random, to make it more natural, what I am going to do is remove some of the shapes if some noise value is less than some value:



And I am going to group what we just did, where the seed is the distortion of the noises:



Now is the time to create multiple layers of this and combine them, but before doing that, lets assign some colors to the shapes to see them better using one of the noise outputs as the color channel:



To create the layers, we are going to use a loop, the loop structure is provided by the ShaderNodesExtra Addon:



In the loop, we offset the coordinates plane by some random amount, mix the old color with the new one and reassign, very simple. This gives us the result:



Here is the blend file: