Maxmaxmахimus,
Та вообще зависимость факториальная - но имхо нун рыть в сторону рядов - что-то мне напоминает Ко всему прочему - мон найти вариации делителей всех чисел до 100, этого должно хватать для боль мень равномерной статистики и оценки при непопадании на простые числа(ну и их комбинации |
Прошу прошения, если данный варинат уже был, распределяю добавки к минимальному значению.
Последнее число, в принципе, и не может быть случайным по самой формулировке задачи (оно закономерно является разницей расчленяемого числа и суммы предыдущих полученных чисел). <script> window.onload = function () { function f(num, part, min) { if (num / part < min) { alert('не реально'); return; } var rest = num - min * part; var mas = []; var elem = 0; for (var i = 1; i < part; i++) { elem = Math.round(rest * Math.random()); mas.push(min + elem); rest -= elem; } mas.push(min + rest); alert(mas); } f(130, 3, 20) } </script> |
Есть мысля рекурсивно дробить число на две рандомные половики пока не получится нужное количество частей, но тестить сейчас лень.)
|
bes,
Вроде родил идентичное Вашему: <style type="text/css">input{margin:4px;}</style> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <input id=Number type="text" value="100" > Число <br /> <input id=Nparts type="text" value="4" > Кол-во разбиваемых частей<br /> <input id="Min-a" type="text" value="1" > Минимальное значение каждой части<br /> <input id="Out-2" type="text" size="35" value=""> Выходной массив разбивки <br /> <input type="button" value="Разбить" onClick="TstNum()"> <script type="text/javascript"> function TstNum(){ var a = parseInt($('#Number').val()); var b = parseInt($('#Min-a').val()); var N = parseInt($('#Nparts').val()); //alert(a+'||'+b+'||'+N) var Arr = []; var Summ = 0; for(var i=0; i<N; i++){ Arr[i] = Math.random(); Summ+=Arr[i]; } var DELTA_FromParts = (a - b*N); var Ost = a; for(var i=0; i<N-1; i++){ Arr[i] = b + parseInt((DELTA_FromParts*Arr[i])/Summ) Ost-= Arr[i]; } Arr[N-1] = Ost; //alert(Arr); b=Arr.join();c=eval(Arr.join('+')); $("#Out-2").val(b+'='+c); } </script> |
<div id="div"> <input value="130"> Число <br> <input value="3"> Количество частей <br> <input value="20"> Минимальное значение части<br> <input type="button" value="Разбить"> </div> <script> window.onload = function () { function f(num, part, min) { if (num / part < min) { alert('не реально'); return; } var rest = num - min * part; var mas = []; var elem = 0; for (var i = 1; i < part; i++) { elem = Math.round(rest * Math.random()); mas.push(min + elem); rest -= elem; } mas.push(min + rest); alert(mas); } function check (elem) { if (isNaN(elem) == false && elem.value != '') { return true; } else { return false; } } var div = document.getElementById('div'); div.children[6].onclick = function () { var num = parseInt(div.children[0].value); var part = parseInt(div.children[2].value); var min = parseInt(div.children[4].value); if (check(num) && check(part) && check(min)) { f (num, part, min); } else { alert('в полях есть не число') } } } </script> PS: добавил поля для ввода |
Увидел разницу
bes, берёт рандом от остатка за вычетом предыдущего рандома, - что не айс - поскольку увеличивает вероятность больших размеров для первых элементов деления и уменьшает для конечных. я же беру рандом для всех частей, с последующим нормированием каждого на общую сумму рандомов - что обеспечивает независимость каждой части |
Deff, у меня распределение настолько случайно, насколько случайна сама Math.random() :) (+ только в том, что это делается за part (количество частей) шагов без лишних проверок)
Цитата:
|
Цитата:
Оки - вызови функцию 100 раз и запиши среднее арифметическое для 1-й;2-й; и 3-й доли - они будут убывать! Параметры разделения и начальных условий - не меняем |
Deff, 100 раз не тестил (не до этого :) ), если не нормально, ок, верю, оставляю только первую фразу
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 17:54. |