Вот моё решение, в котором все возможности выпадают с одинаковой вероятностью.
function divide(a, n, m) {
if (n*m>a)
return;
var b=[], d=[], p=a-(m-1)*n-1;
for (var i=0; i<p; i++)
b[i]=i; // делаем массив b из чисел 0, 1, ..., p-1
for (; i>a-m*n; i--) {
var c=Math.floor(Math.random()*i); // выбираем случайный элемент из b
d.push(b[c]);
b[c]=b[i-1]; // удаляем его, считаем, что длина массива b теперь i-1
}
d.sort(function (x, y) {
return x-y;
});
d.push(p); // после этой инструкции массив d будет содержать n различных неотрицательных чисел, отсортированных по возрастанию, последнее из которых p. С помощью этого массива формируется выходной массив, для которого будем использовать переменную b заново
b.length=0;
b[0]=d[0]+m;
for (i=0; i<n-1; i++)
b.push(d[i+1]-d[i]+m-1);
return b;
}
alert(divide(130, 3, 20));
Ред. Упс, где-то ошибка, выпало 70, -22, 82. Сейчас попробую исправить.
Ред. Уже исправил. Оказывается, метод sort, если не задана сравнительная функция, сортирует элементы как строки.