Прикольная задачка. Предыдущие ответы не читал, ибо лень.
// предполагается, что все аргументы - целые неотрицательные числа
function SplitNum (sum, summands, min) {
if (summands < 1 || summands * min > sum) {
return []; // если операцию выполнить невозможно, возвращаем пустой массив
}
var i;
var range = sum - summands * min; // сумма слагаемых после вычета минимумов
var points = []; // здесь будут точки деления диапазона [0; range]
for (i=0; i<summands-1; i++) { // произвольных точек деления на 1 меньше, чем слагаемых
// генерируем псевдослучайное целое число в диапазоне [0; range]
points[i] = Math.floor(Math.random() * (range + 1));
}
points.push(0, range); // добавляем стартовую и конечную точки деления
points.sort(function (a, b) { return a - b; }); // сортируем по возрастанию
var result = []; // сюда будем сгребать слагаемые
for (i=0; i<summands; i++) {
// слагаемое вычисляем по разнице между точками деления с добавлением минимума
result[i] = points[i+1] - points[i] + min;
}
return result; // возвращаем массив слагаемых
}
var text = "";
text += SplitNum(130, 3, 20) + "\n";
text += SplitNum(130, 3, 0) + "\n";
text += SplitNum(130, 1, 20) + "\n";
text += SplitNum(100, 10, 10) + "\n";
text += SplitNum(100, 4, 24) + "\n";
text += SplitNum(100500, 10, 10000);
alert(text);
UPD:
oneguy опередил меня, потому что комменты зажопил.)) Хотя наши решения немножко отличаются.