In reply to Jeff_Li_90:
Let me address your second question first. The recommended practice is constructing a dynamic array with a maximum size first and constructing each element first. Then let randomization prune the array to the desired size. This has the benefit of preserving random stability since the number of constructed objects affects the random seeding. If calling randomize() causes the construction of a random number of objects, then a modification of constraints could lead to a disturbance in randstate for randomization statements that occur after it.
That should also cover most of your first question, but other reasons include the difficulty in passing arguments to the constructors during randomization.