Являются ли ваши разрывы равномерными (равной вероятности) или нет? Для равномерных разрывов вы можете использовать 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
Возможно, я должен описать, что это такое 'findInterval'! Учитывая значение x и вектор отсортированных точек доступа vec, он находит те точки пересечения, которые находятся между ними, т. Е. Какой интервал x попадает. Точнее, если 'vec [i]