Я не уверен насчет равномерности распределения, но это случайность настолько, насколько я могу думать прямо сейчас, и я буду избегать столкновений:
While items in itemBucket:
item = getNextItem()
legalPosition = false
While not legalPosition:
newPosition = choose random location/position
legalPosition = isPositionLegal(newPosition)
Таким образом, выбирая элементы по одному в время, а затем устанавливая и проверяя их по одному, вы обязательно получите правильное позиционирование (если только вы не расположите первые элементы так, что это вообще невозможно сделать)