Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите написать числовую функцию (https://javascript.ru/forum/misc/30242-pomogite-napisat-chislovuyu-funkciyu.html)

Deff 30.07.2012 02:40

Maxmaxmахimus,
Та вообще зависимость факториальная - но имхо нун рыть в сторону рядов - что-то мне напоминает
Ко всему прочему - мон найти вариации делителей всех чисел до 100, этого должно хватать для боль мень равномерной статистики и оценки при непопадании на простые числа(ну и их комбинации

bes 30.07.2012 12:04

Прошу прошения, если данный варинат уже был, распределяю добавки к минимальному значению.
Последнее число, в принципе, и не может быть случайным по самой формулировке задачи (оно закономерно является разницей расчленяемого числа и суммы предыдущих полученных чисел).
<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>

Aetae 30.07.2012 12:14

Есть мысля рекурсивно дробить число на две рандомные половики пока не получится нужное количество частей, но тестить сейчас лень.)

Deff 30.07.2012 12:36

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>

bes 30.07.2012 17:47

<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: добавил поля для ввода

Deff 30.07.2012 17:59

Увидел разницу

bes, берёт рандом от остатка за вычетом предыдущего рандома, - что не айс - поскольку увеличивает вероятность больших размеров для первых элементов деления и уменьшает для конечных.
я же беру рандом для всех частей, с последующим нормированием каждого на общую сумму рандомов - что обеспечивает независимость каждой части

bes 30.07.2012 18:07

Deff, у меня распределение настолько случайно, насколько случайна сама Math.random() :) (+ только в том, что это делается за part (количество частей) шагов без лишних проверок)
Цитата:

Сообщение от Deff
bes, берёт рандом от остатка за вычетом предыдущего рандома, - что не айс - поскольку увеличивает вероятность больших размеров для первых элементов деления и уменьшает для конечных.

Если потестить, то с этим всё вроде нормально

Deff 30.07.2012 18:20

Цитата:

Сообщение от bes
Если потестить, то с этим всё вроде нормально

bes,
Оки - вызови функцию 100 раз и запиши среднее арифметическое
для 1-й;2-й; и 3-й доли - они будут убывать!

Параметры разделения и начальных условий - не меняем

bes 30.07.2012 18:31

Deff, 100 раз не тестил (не до этого :) ), если не нормально, ок, верю, оставляю только первую фразу
Цитата:

Сообщение от bes
у меня распределение настолько случайно, насколько случайна сама Math.random()


Hekumok 30.07.2012 18:45

Цитата:

Сообщение от Deff (Сообщение 192999)
bes,
Оки - вызови функцию 100 раз и запиши среднее арифметическое для 1-й;2-й; и 3-й доли - они будут убывать!

Параметры разделения и начальных условий - не меняем

Да, чаще всего самая большая - это первая доля! Намного чаще остальных!


Часовой пояс GMT +3, время: 17:54.