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

Сообщение от Aetae
Нигде не оговорено, что порядок выходных значений тоже должен быть рандомизирован
Если я правильно понял задачу, то случайно выбирается упорядоченный набор чисел. Автор вналаче ведь привёл пример, где выходной массив не был упорядочен по возрастанию или убыванию.
Сообщение от Дзен-трансгуманист
Теперь всё в порядке.
Не в порядке. Возьмите SplitNum(2, 3, 0):
function SplitNum (sum, summands, min) {
 
  if (summands < 1 || summands * min > sum) { return []; }
  var i, range = sum - summands * min, points = [], result = [];
  for (i=0; i<summands-1; i++) { points[i] = Math.floor(Math.random() * (range + 1)); }
  points.push(0, range);
  points.sort(function (a, b) { return a - b; });
  for (i=0; i<summands; i++) { result[i] = points[i+1] - points[i] + min; }
 
  for (i=0; i<summands-1; i++) { // перемешиваем порядок слагаемых
    var j = Math.floor(Math.random() * (summands - i)) + i; // генерируем j в диапазоне [i; summands-1]
    var swap = result[i]; result[i] = result[j]; result[j] = swap; // меняем местами значения по индексам i и j
  }
  return result;
}
 
function testDistribution (iterations) {
 
  var i, counter = [];
  for (i=0; i<6; i++) { counter[i] = 0; }
  for (i=0; i<iterations; i++) {
    var r=SplitNum(2, 3, 0);
    counter[r.indexOf(2)==-1?r.indexOf(0)+3:r.indexOf(2)]++;
  }
  return counter;
}
 
alert(testDistribution(27000));

Есть 6 вариантов: [0, 0, 2], [0, 2, 0], [2, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]. Первые 3 выпадают с вероятностью 4/27, остальные - 5/27.

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