Показать сообщение отдельно
  #9 (permalink)  
Старый 28.07.2012, 22:59
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Вот моё решение, в котором все возможности выпадают с одинаковой вероятностью.
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, если не задана сравнительная функция, сортирует элементы как строки.

Последний раз редактировалось oneguy, 29.07.2012 в 00:06.
Ответить с цитированием