Сообщение от 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.