Если я правильно понимаю, вы можете зациклить что-то вроде следующего (после установки всех элементов в начальные значения 1, так как возможные значения от 1 до 5):
capture generate rand_int = 0
replace rand_int = floor( 5 * runiform() + 1 ) // random int, 1 to 5
capture generate cnd = 0
forvalues k = 1(1)5 {
replace cnd = rand_int == `k' & sum_item < y & item`k' < 6
replace item`k' = item`k' + 1 if cnd
}
replace sum_item = item1+item2+item3+item4+item5
В словах,это говорит о том, что если sum_item < y
, то случайным образом добавить 1 к одному из элементов (при условии, что этот элемент еще не равен 5), и тогда вы продолжите делать это до sum_item == y
для всех строк.
Так что это будет сходиться примерно за 20 итераций, если максимальное значение y
равно 25, а элементы от 1 до 5. Я говорю «примерно», потому что здесь есть небольшая трата, когда вы добавляете 1 к элементуэто уже равно 5. Вы могли бы добавить дополнительный код для этого, но я бы не стал беспокоиться, если это достаточно быстро. Например, для высоких значений item_sum
было бы более эффективно начинать с начальных значений 5 и случайным образом вычитать 1, пока оно не сходится.
Мне недостаточно статистики, чтобы сказать, что это лучше, или дажеадекватный способ сделать это, но для меня интуитивно кажется нормальным, если вы хотите достаточно равномерное распределение значений. Например, если вы хотите, чтобы модальное значение было равно 4, это намного сложнее и больше не является вопросом программирования.