Ваши перерывы одинаковы (одинаковая вероятность) или нет?
Для равномерных разрывов вы можете использовать ceil (k * u), где u - вектор или случайные равномерные числа.
Например, если вы хотите, чтобы 10 наблюдений случайным образом присваивались числам 1-4 с равной вероятностью, вы можете сказать
y = ceil(4*ranuni(j(10,1)));
или, если вы хотите использовать более новый генератор случайных чисел,
u = j(10,1); /** allocate **/
call randgen(u, "uniform"); /** fill with U[0,1] **/
y = ceil(4*u);
Для неравной вероятности используйте «табличное» распределение. Например,
p = {0.1 0.5 0.2 0.2}; /** four categories with given probabilities **/
y = j(10, 1);
call randgen(y, "Table", p); /** fills with 1-4 with probability p **/
Вас может заинтересовать использование модуля SampleWithReplace из главы 13 моей книги, Статистическое программирование с помощью программного обеспечения SAS / IML . Вы можете скачать код и посмотреть пример его использования на
http://blogs.sas.com/iml/index.php?/archives/75-Hey!-Those-Two-People-Have-the-Same-Initials!.html
Обе эти методики устраняют необходимость в findInterval, поскольку они создают категории напрямую. Если вы ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО думаете, что вам нужно скопировать случайные числа, вы можете использовать алгоритм, который я описал здесь:
http://blogs.sas.com/iml/index.php?/archives/80-Count-the-Number-of-Points-in-Bins-Efficiently.html